2011-04-23 50 views
0

我啓動3個pthread並在運行我的應用程序幾次後,我發現根據創建語句的順序沒有確切的線程創建順序。啓動另一個正在運行的線程

一旦某個線程啓動後,如何創建另一個線程?

我仍然想從同一個「級別」創建線程,而不是從線程內部創建所需的線程,我想先從頭開始。

+0

獲取線程開始設置併發對象,然後等待主線程。一旦設置完成,你就知道第一個線程已經啓動,你可以開始第二個線程等等。 – forsvarir 2011-04-23 18:50:50

+0

線程的內在本質不是順序確定的,你應該重新安排你的代碼,以便它不重要! – Kevin 2011-04-23 19:06:47

回答

1

線程沒有「級別」或父/子關係。包括初始線程主線程在內的所有線程都是對等體。只要線程描述符有效且線程未分離,任何線程都可以在任何其他線程上調用pthread_join

如果確實需要執行排序,最簡單的工具是障礙(pthread_barrier_wait)。另一方面,條件變量更強大,但更難使用,並且可能不需要這種情況。

+0

我決定將全局int設置爲0,然後在線程內將其設置爲1。所以當它設置爲1時,我啓動另一個線程,因爲在我的主循環中我有一個if檢查== 1,然後它啓動線程。如果存在,我寧願使用內置函數。 barrier_wait似乎並不正確。 – jarryd 2011-04-23 21:39:27

+0

您的解決方案不正確。您無法讀取由不同的線程修改的變量,而無需中間的同步操作,或者結果爲UB。 – 2011-04-23 21:44:53

+0

我在最後使用了條件語句pthread_cond_wait等以及互斥體。謝謝 – jarryd 2011-04-24 18:56:18

0

是否可以從線程函數調用調用pthread_create()?

pthread_create創建一個線程,並且正如您發現的那樣,它不會調用線程函數。基本上,您的新線程位於活動線程列表中,並且調度程序可以在它選擇時給它一個時間片。通常這是幾個毫秒,但可以更長。

相關問題