0

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

4

1 回答 1

1

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

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

于 2013-11-07T14:11:20.643 回答