[英]Integrating pthread_create() and pthread_join() in the same loop
[英]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.