背景:在进程中使用condition_variable控制线程的阻塞和唤醒时,按照实现逻辑是线程二发布数据后存在10秒超时的wait()进行反馈数据处理等待,线程一接收反馈数据触发notify_all()使得线程二退出wait()的阻塞并返回成功进行处理反馈的数据。
问题:偶现notify_all()调用后,并未按照wait()退出阻塞的逻辑,而是等待超时了。
解决:notify_all()之前增加短暂的延时。(增加多一个条件变量进行控制也可以解决)
原因: notify_all()在wait()之前被调用了。
int Smaple::SendEventReq()
{
std::unique_lock<std::mutex> lock(local_data.event_mtx);
local_data.hpaRequestPublisher->publish<DesayInterface_HpaEventReq>(dat);
if (local_data.event_cv.wait_for(lock, std::chrono::seconds(timeout)) == std::cv_status::timeout) {
printf("time out %ld...\n",timeout);
return -1;
} else {
*result = local_data.eventRusult;
return 0;
}
}
int Smaple::Init()
{
std::thread taskCubscribe([&](DesayInterface_HpaEventResp& msg) {
printf("CB-Resp(%d), get data\n", getpid());
memset(&local_data.eventRusult, 0x00, sizeof(local_data.eventRusult));
local_data.eventRusult = msg;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
local_data.event_cv.notify_all();
})
}
如有描述不对的,还请大神指针,学习至上。
|