在线程中等待一段时间,或者直到条件发生

时间:2013-11-07 13:46:40

标签: c++ multithreading boost c++11 synchronization

我正在用C ++编写服务,我有一些线程需要在给定的时间内休眠。

到目前为止很好,boost::this_thread::sleep_for有效,但我现在需要一些中断(例如,停止信号)。 Boost没有cancellation_token,到目前为止,我有类似的内容:

boost::mutex _waiting_mutex;
boost::condition_variable _waiting_cv;

void wait(const boost::chrono::duration& timeout)
{
    boost::unique_lock<boost::mutex> lk(_waiting_mutex);
    _waiting_cv.wait_for(lk, timeout); 
}

void signal_termination()
{
    _waiting_cv.notify_all();
}

这适用于一个线程(睡眠5秒,或直到调用signal_termination()),但不适用于多个线程 - 第一个线程很好地休眠,但第二个线程等待第一个线程离开锁定,然后睡觉。

如何克服这个unique_lock?我应该引入具有最大线程数的信号量吗?

在C#中,我使用ManualResetEvent

1 个答案:

答案 0 :(得分:1)

我不确定你是如何为多线程测试它的,但是你得到了错误的结果。条件变量wait()或wait_for()调用在等待信号时解锁互斥锁。其他为什么你必须把锁传递给那个函数?

  

请注意,锁被传递给wait:wait会将线程原子地添加到等待条件变量并解锁互斥锁的线程集中。当线程被唤醒时,互斥锁将在等待调用返回之前再次被锁定。这允许其他线程获取互斥锁以更新共享数据,并确保与条件关联的数据正确同步。