Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在等待线程,直到出现条件_C++_Multithreading_Simulator - Fatal编程技术网

C++ 正在等待线程,直到出现条件

C++ 正在等待线程,直到出现条件,c++,multithreading,simulator,C++,Multithreading,Simulator,我想等待在同步模拟器中执行的两个线程中的一个线程,直到出现一个条件,可能是在模拟器中运行程序1000个或更多周期后出现的条件,在条件出现后,等待的线程再次执行,我怎么做?您需要条件变量 如果您的编译器支持C++11引入的std::conditional,那么您可以查看以下详细信息: 如果您的编译器不支持它,而您使用的是win32线程,请参见以下内容: 这是一个完整的例子 如果您使用POSIX线程,请参见以下内容: 您可以在这里看到我使用win32原语实现的条件_变量:

我想等待在同步模拟器中执行的两个线程中的一个线程,直到出现一个条件,可能是在模拟器中运行程序1000个或更多周期后出现的条件,在条件出现后,等待的线程再次执行,我怎么做?

您需要条件变量

如果您的编译器支持C++11引入的
std::conditional
,那么您可以查看以下详细信息:

如果您的编译器不支持它,而您使用的是win32线程,请参见以下内容:

这是一个完整的例子

如果您使用POSIX线程,请参见以下内容:


您可以在这里看到我使用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变量的诀窍在于等待它会导致获取的互斥被释放,直到等待调用返回,此时互斥被再次获取。顺序是:

  • 获取互斥
  • 而谓词不是真的
    • 等待条件变量
  • 做关键部位的工作
  • 如果谓词为真
    • 信号条件变量
  • 释放互斥
信号步骤用于多个线程进入上述同一临界段的情况

如果不同的线程可能访问相同的互斥体以修改影响谓词的状态,则该线程应检查是否需要通知任何人

  • 获取互斥
  • 做关键部位的工作
  • 如果谓词为真
    • 信号条件变量
  • 释放互斥
感兴趣的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()

使用信号量发信号。示例(应用程序清除退出)如下所示:

在标题中声明

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();