【发布时间】:2013-11-07 13:46:40
【问题描述】:
我正在用 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。
【问题讨论】:
-
见 stackoverflow.com/q/1501111/56778 以获得提升
ManualResetEvent
标签: c++ multithreading boost c++11 synchronization