2017-08-02 139 views
1

線程池是否可以在沒有互斥鎖的單線程函數上運行?線程池是否可以在單線程函數上運行?

像下面這樣。

void* thread_func(void* p) { 
} 

for(int i = 0 ; i < N ; i++) } 
    pthread_create(&t_id, &attr, thread_func, null); 
} 

還是應該通過每個pthread_create它自己的線程函數?

+2

我不確定你的確切含義,但是如果你打算在池中的所有線程上運行相同的函數,這取決於你是否正在訪問共享資源e。 G。櫃檯或類似物。 – CRoemheld

+0

@marcusshep請不要在隨機短語上使用代碼格式,只能在代碼和變量/函數名稱上使用。 – interjay

+2

您可以對多個線程使用相同的線程函數。如果你正在訪問被修改的共享數據,那麼你可能需要一個互斥鎖。 – interjay

回答

2

線程池是否可以在沒有互斥鎖的單線程函數上運行?

是的,它是可能。但這取決於你的thread_func功能。如果您正在訪問一個共享資源,例如一個計數器,你不使用互斥,那麼你可能會遇到一個競爭條件

int counter; // set to 2 in main function 

void* thread_func(void *p) { 
    counter = counter + 1; 
} 
  • 線程A從計數器讀取(價值: 2)
  • 線程B從計數器讀取(值:2)
  • 線程B增加計數器(值:3)
  • 線程A增加計數器(值:3)

發生這種情況是因爲線程A對於計數器的值仍然爲2,並且在兩個線程完成增加值之後,即使正常理解計數器值應該爲4,也會加上1,結果爲3(再次)。

如果添加互斥量,線程必須等待當前修改計數器值的另一個線程。

相關問題