C++ 正在等待线程,直到出现条件
我想等待在同步模拟器中执行的两个线程中的一个线程,直到出现一个条件,可能是在模拟器中运行程序1000个或更多周期后出现的条件,在条件出现后,等待的线程再次执行,我怎么做?您需要条件变量 如果您的编译器支持C++11引入的C++ 正在等待线程,直到出现条件,c++,multithreading,simulator,C++,Multithreading,Simulator,我想等待在同步模拟器中执行的两个线程中的一个线程,直到出现一个条件,可能是在模拟器中运行程序1000个或更多周期后出现的条件,在条件出现后,等待的线程再次执行,我怎么做?您需要条件变量 如果您的编译器支持C++11引入的std::conditional,那么您可以查看以下详细信息: 如果您的编译器不支持它,而您使用的是win32线程,请参见以下内容: 这是一个完整的例子 如果您使用POSIX线程,请参见以下内容: 您可以在这里看到我使用win32原语实现的条件_变量:
std::conditional
,那么您可以查看以下详细信息:
您可以在这里看到我使用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
其中,
CheckCondition
是检查条件的函数(或函子)。当它意外唤醒时,wait()
函数在内部调用它,如果条件尚未满足,wait()
函数将再次休眠。在进入睡眠状态之前,wait()
会自动释放互斥锁。如果您没有C++11,但是您有一个支持POSIX线程的系统,那么您可以使用条件变量。还有其他选择,但根据您描述问题的方式,条件变量可能是最直接的选择
pthread条件变量与互斥锁一起使用。condition变量的诀窍在于等待它会导致获取的互斥被释放,直到等待调用返回,此时互斥被再次获取。顺序是:
- 获取互斥
- 而谓词不是真的
- 等待条件变量
- 做关键部位的工作
- 如果谓词为真
- 信号条件变量
- 释放互斥
- 获取互斥
- 做关键部位的工作
- 如果谓词为真
- 信号条件变量
- 释放互斥
pthread_mutex_init()
pthread_mutex_destroy()
pthread_mutex_lock()
pthread_mutex_unlock()
pthread_cond_init()
pthread_cond_destroy()
pthread_cond_wait()
pthread_cond_signal()
使用信号量发信号。示例(应用程序清除退出)如下所示: 在标题中声明
static sem_t semPrepareExit; //declaration
在源代码中(主线程)
在源代码中,(派生线程)
现在,只要你用“sem_post”在信号灯上发信号。主线程将在等待节点/点接收信号,然后继续执行。尝试以下操作:
class CmyClass
{
boost::mutex mtxEventWait;
bool WaitForEvent(long milliseconds);
boost::condition cndSignalEvent;
};
bool CmyClass::WaitForEvent(long milliseconds)
{
boost::mutex::scoped_lock mtxWaitLock(mtxEventWait);
boost::posix_time::time_duration wait_duration = boost::posix_time::milliseconds(milliseconds);
boost::system_time const timeout=boost::get_system_time()+wait_duration;
return cndSignalEvent.timed_wait(mtxEventWait,timeout); // wait until signal Event
}
//因此,为了等待,然后调用WaitForEvent方法
WaitForEvent(1000); // it will timeout after 1 second
//这就是事件的信号传递方式:
cndSignalEvent.notify_one();
查找条件变量和信号量。还可以查看承诺和未来()
WaitForEvent(1000); // it will timeout after 1 second
cndSignalEvent.notify_one();