2010-11-08 78 views
1

我正在寫一個pthread程序。根據我在C#中的經驗,我認爲創建線程可能存在競爭條件。pthread_create()中是否存在潛在的競爭條件?

for (i = 0; i < 10; i++) 
{ 
    pthread_create(threads[i], NULL, &do_something, (void*)&data[i]); 
} 

是否有可能在創建新線程之前更新局部變量i?因此數組中的錯誤數據或線程條目可能會傳遞給do_something函數?至少在C#中,如果我使用Task.Factory.StartNew(),這是一個很大的問題。

在此先感謝。

回答

3

一旦pthread_create返回按值傳遞的所有內容都將被成功複製,實際上,在甚至完全輸入pthread_create函數之前,都會使用i進行評估。對於void *參數,指針本身也是通過值傳遞的。

例如,如果您通過引用(或指針)傳遞i並使用它訪問啓動例程內的數組,則存在創建競爭條件的可能性。但是在這個例子中顯然不是這種情況。

+0

這是我最初的設計:直接傳給我。然後我意識到了這個問題。但我不確定我問的問題。非常感謝。 – LLS 2010-11-08 10:22:58

+0

只要線程和數據(如果它甚至被使用)超出線程本身,你一定很好。 – Flexo 2010-11-08 10:27:55