【问题标题】:Wait in threads for some time, OR until condition occurs在线程中等待一段时间,或者直到条件发生
【发布时间】: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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2012-06-14
  • 2013-03-02
  • 2012-01-19
  • 2014-04-24
  • 1970-01-01
  • 2011-11-20
  • 2014-10-09
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多