我正在用 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
.