假设某些条件变量"cond"与互斥变量"mutex"相关联.如果线程cond
在调用后处于休眠状态pthread_cond_wait(&cond,&mutex)
,并且另一个已mutex
锁定的线程已完成,则该线程在调用pthread_cond_signal(&cond)
之前或之后调用pthread_mutex_unlock(&mutex)
是否重要?它是否甚至需要解锁互斥锁pthread_cond_signal(&cond)
,因为睡眠线程无论如何都会获取互斥锁?
编辑:根据https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview,"调用pthread_cond_signal()后未能解锁互斥锁可能不允许匹配的pthread_cond_wait()例程完成(它将保持阻塞状态). " 我想那时,解锁,也许只是之后才需要.
我对conditions_variables
如何使用它们(安全地)感到困惑。在我的应用程序中,我有一个创建 gui 线程的类,但是当 gui 由 gui 线程构建时,主线程需要等待。
情况与下面的函数相同。主线程创建互斥锁、锁和condition_variable
. 然后它使线程。虽然这worker
thread
还没有通过某个点(此处打印数字),但不允许主线程继续(即必须wait
打印所有数字)。
condition_variables
在这种情况下如何正确使用?另外,我读到自发唤醒是一个问题。我该如何处理它们?
int main()
{
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
std::condition_variable convar;
auto worker = std::thread([&]{
/* Do some work. Main-thread can not continue. */
for(int i=0; i<100; ++i) std::cout<<i<<" ";
convar.notify_all(); // let main thread continue
std::cout<<"\nworker done"<<std::endl;
});
// The main thread can do some work but then must wait until the worker has done it's calculations.
/* do some stuff …
Run Code Online (Sandbox Code Playgroud)