等待pthread_create完成而不使用pthread_join

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)

fa.*_*fa. 7

您可以使用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)