等待线程直到条件发生

Ang*_*kin 22 c++ multithreading simulator

我想等待在Simultaneous模拟器中执行的2个线程的一个线程,直到条件发生,可能是在模拟器中运行程序1000个或更多周期后发生的条件,条件发生后再次执行等待的线程,我该怎么做?

Naw*_*waz 32

你需要条件变量.

如果你的编译器支持std::conditionalC++ 11引入,那么你可以看到这个细节:

如果你的编译器不支持它,并且你使用win32线程,那么看看:

这里是一个完整的例子.

如果你使用POSIX线程,那么看看:


你可以conditional_variable在这里看到我使用win32原语的实现:

向下滚动并首先查看它的实现,然后查看并发队列实现中的用法.

条件变量的典型用法是:

//lock the mutex first!
scoped_lock myLock(myMutex); 

//wait till a condition is met
myConditionalVariable.wait(myLock, CheckCondition);

//Execute this code only if the condition is met
Run Code Online (Sandbox Code Playgroud)

哪里CheckCondition是检查条件的函数(或函子).它wait()虚假唤醒时由内部函数调用,如果条件尚未满足,则wait()函数再次休眠.在进入睡眠状态之前,以原子方式wait()释放互斥锁.


jxh*_*jxh 6

如果您没有C++ 11,但确实有一个支持POSIX线程的系统,那么您可以使用条件变量.还有其他选择,但根据您描述问题的方式,条件变量可能是最直接的.

pthread条件变量与互斥锁一起使用.条件变量的技巧是等待它会导致获取的互斥锁被释放,直到等待调用返回,此时再次获取互斥锁.顺序是:

  • 获得互斥
  • 虽然预测不正确
    • 等待条件变量
  • 做关键部分的工作
  • 如果PREDICATE是真的
    • 信号条件变量
  • 释放互斥

如果多个线程进入上面的相同关键部分,则使用信号步骤.

如果不同的线程可以访问相同的互斥锁以修改影响PREDICATE的状态,则该线程应检查是否需要发信号通知任何人.

  • 获得互斥
  • 做关键部分的工作
  • 如果PREDICATE是真的
    • 信号条件变量
  • 释放互斥

感兴趣的POSIX命令是:

pthread_mutex_init()
pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_cond_init()
pthread_cond_destroy()
pthread_cond_wait()
pthread_cond_signal()
Run Code Online (Sandbox Code Playgroud)