簡體   English   中英

等待pthread_create完成而不使用pthread_join

[英]Waiting for pthread_create to finish without using pthread_join

我想暫停一個線程,直到另一個線程完成初始化而不使用pthread_join。 我嘗試使用聯接,但是由於我們擁有一些異步線程間通信系統,因此導致死鎖。 現在,我正在使用(自定義)鎖來實現此目的。

在線程1中:

lock_OfflineWorker.Lock()
if (pthread_create(&tid0, NULL, RunOfflineWorker, NULL) != 0)
{
}

lock_OfflineWorker.TryLock();
lock_OfflineWorker.Unlock();

在線程2中:

bool OfflineWorker::Initialize()
{
  lock_OfflineWorker.Unlock();
}

但這是不雅的,我對副作用(不太可能出現另一個死鎖)不太確定。 這個可以嗎? 如果沒有,還有另一種方法可以實現(使用鎖或其他方式)

編輯:忘記了包含“ RunOfflineWorker”功能

void* RunOfflineWorker(void* pData)
{   
  g_OfflineWorker.Initialize();
}

您可以使用pthread條件等待作業達到所需狀態。

線程1等待pthread_cond_wait() ,線程2通過pthread_cond_signal()發出信號。

你需要 :

bool            condition ; // or anything else to be tested
pthread_mutex_t mutex ;
pthread_cond_t  cond ;

第一個線程初始化所有:

condition = false ;
pthread_mutex_init( &mutex , PTHREAD_MUTEX_INITIALIZER );
pthread_cond_init( &cond , PTHREAD_COND_INITIALIZER );

然后等待互斥鎖被鎖定。 通常,您將等待放在循環中以檢查條件是什么。

pthread_mutex_lock( &mutex );
while( ! condition )
{
    pthread_cond_wait( &cond , &mutex );
}
pthread_mutex_unlock( &mutex );

另一個線程在適當的時候這樣做:

pthread_mutex_lock( &mutex );
condition = true ; // or false ...
pthread_cond_signal( &cond );
pthread_mutex_unlock( &mutex );

我認為您的解決方案很好,只是您需要在線程1中使用lock_OfflineWorker.Lock()而不是lock_OfflineWorker.TryLock() -使用TryLock() ,它實際上不會等待任何東西。 您不能為此使用互斥鎖,因為它需要由鎖定它的同一線程釋放,但是例如。 一個基於信號量的鎖就可以了。 使用監視器(即互斥體+ condvar)將更加復雜。

關於死鎖:如果OfflineWorker的初始化部分(即釋放鎖之前的代碼)沒有在任何地方等待,則死鎖是不可能的。 如果您的解決方案中存在實際的死鎖,則使線程1等待線程2的任何其他解決方案也將具有死鎖(我可以想象這種情況)。

注釋后編輯:如果在等待線程2初始化完成時將消息傳遞給線程1,則可能會出現死鎖,尤其是當消息有一定的緩沖區或消息傳遞函數等待答復時。 在這種情況下,我建議您放棄等待線程2的想法,也許傳遞一些初始化完成時將從線程2調用的回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM