我正在用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
。
答案 0 :(得分:1)
我不确定你是如何为多线程测试它的,但是你得到了错误的结果。条件变量wait()或wait_for()调用在等待信号时解锁互斥锁。其他为什么你必须把锁传递给那个函数?
请注意,锁被传递给wait:wait会将线程原子地添加到等待条件变量并解锁互斥锁的线程集中。当线程被唤醒时,互斥锁将在等待调用返回之前再次被锁定。这允许其他线程获取互斥锁以更新共享数据,并确保与条件关联的数据正确同步。