Gay*_*yan 1 c++ multithreading
我想暂停一个线程,直到另一个线程完成初始化而不使用pthread_join.我尝试使用连接,但由于我们拥有一些异步的线程间通信系统,它会导致死锁.现在,我正在使用(自定义)锁来实现这一目标.
在线程1中:
lock_OfflineWorker.Lock()
if (pthread_create(&tid0, NULL, RunOfflineWorker, NULL) != 0)
{
}
lock_OfflineWorker.TryLock();
lock_OfflineWorker.Unlock();
Run Code Online (Sandbox Code Playgroud)
在线程2中:
bool OfflineWorker::Initialize()
{
lock_OfflineWorker.Unlock();
}
Run Code Online (Sandbox Code Playgroud)
但这是不优雅的,我不太确定副作用(另一种僵局的可能性).这个可以吗?如果没有,是否有另一种方法来实现这一点(使用锁或其他)
编辑:忘记包括"RunOfflineWorker"功能
void* RunOfflineWorker(void* pData)
{
g_OfflineWorker.Initialize();
}
Run Code Online (Sandbox Code Playgroud)
您可以使用pthread条件等待作业达到所需状态.
thread1等待,pthread_cond_wait()而thread2发出信号pthread_cond_signal().
你需要 :
bool condition ; // or anything else to be tested
pthread_mutex_t mutex ;
pthread_cond_t cond ;
Run Code Online (Sandbox Code Playgroud)
所有的第一个线程:
condition = false ;
pthread_mutex_init( &mutex , PTHREAD_MUTEX_INITIALIZER );
pthread_cond_init( &cond , PTHREAD_COND_INITIALIZER );
Run Code Online (Sandbox Code Playgroud)
然后等待锁定互斥锁.通常你把等待放在一个循环中来检查条件,无论它是什么.
pthread_mutex_lock( &mutex );
while( ! condition )
{
pthread_cond_wait( &cond , &mutex );
}
pthread_mutex_unlock( &mutex );
Run Code Online (Sandbox Code Playgroud)
另一个线程在适当时执行此操作:
pthread_mutex_lock( &mutex );
condition = true ; // or false ...
pthread_cond_signal( &cond );
pthread_mutex_unlock( &mutex );
Run Code Online (Sandbox Code Playgroud)