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()释放互斥锁.
如果您没有C++ 11,但确实有一个支持POSIX线程的系统,那么您可以使用条件变量.还有其他选择,但根据您描述问题的方式,条件变量可能是最直接的.
pthread条件变量与互斥锁一起使用.条件变量的技巧是等待它会导致获取的互斥锁被释放,直到等待调用返回,此时再次获取互斥锁.顺序是:
如果多个线程进入上面的相同关键部分,则使用信号步骤.
如果不同的线程可以访问相同的互斥锁以修改影响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)