2012-10-21 29 views
0

在我的main()函數中,我呼籲pthread_create創建一個新線程。我傳入文本文件的名稱,然後線程打開文本文件,計算行數,然後將該數字返回到main(),其中我將整數totalCount +=設置爲返回的數字。爲什麼使用pthread時我的計數線程不能正常工作?

我知道線程函數能正常工作,因爲我用另一段代碼來計算文本文件中的行數。當我使用循環不止一次呼叫pthread_create時,問題就出現了。我從計數一個文件得到的totalCount是準確的,但是當我打開兩個或多個文件時,totalCountmain()中是錯誤的。

在我的程序中出現了什麼問題導致了這種情況?這是我的線程函數中的問題嗎?我的pthread_join?我知道這個問題在沒有代碼的情況下可能非常模糊,但是根據這種描述,任何想法都可以?

+2

「我知道這個問題可能是非常模糊的沒有代碼,但任何想法都給予了這種描述?」確實不明確。似乎你應該發佈代碼? – Corbin

+3

您可能會遇到競爭狀況,或者您沒有正確保護您的共享資源。如果沒有看到您的代碼,我不能告訴您問題是什麼。 – OmnipotentEntity

+0

你說你正在創建多個線程?你有可能用每個新線程覆蓋pthread_t,從而只加入* last *之一。順便說一句,有些代碼會使這個* LOT *更容易。 – WhozCraig

回答

0

W/O代碼都是猜測。但肯定totalCount +=不是線程安全的。您需要一個原子互鎖操作(例如,__sync_fetch_and_add),或者您需要使用互斥鎖來保護它。

0

在黑暗中拍攝它的樂趣 - 我發現這個錯誤的唯一方法是如果內部行計數器 - 不是totalCount,而是跟蹤每個文件中的行數 - 是一個全局變量。每個pthread大概會調用相同的行計數函數,因此每個文件的行計數在其他線程更新時將錯誤地增加。所以我會預測totalCount總是大於,不小於實際的行數。

相關問題