2010-10-27 116 views
17

我一直花費一些時間來調試給出分段錯誤的程序。該錯誤是非常不確定的,並且是間歇性的,這很煩人。我縮小了對strtok的呼籲。我懷疑這是調用strtok在兩個不同的線程中分割字符串導致分段錯誤。我可以在兩個不同的線程中調用strtok嗎?strtok函數線程安全

謝謝。

+0

當它實際上是C問題時,請不要標記問題C++。 – 2010-10-27 08:34:57

回答

35

strtok()不可重入,因此不應使用線程應用程序,而應使用strtok_r()

+0

我試過使用Dev-C++來製作一個C程序,而strtok_r不可用:(我不確定什麼標準/版本/編譯器devcpp使用 – 2012-08-06 21:03:29

+0

POSIX標準版本的strtok有一個額外的指針。狀態,只要不同的指針使用不同的指針,該版本就是線程安全的。 – Calmarius 2012-12-01 10:13:05

6

strtok()不是MT安全的,因爲它全局存儲了一些中間變量,並在每次調用時重複使用它們(每次調用strtok()時都不必再次傳遞字符串)。 您可以查看您正在使用的方法的手冊頁,並且如果它是MT安全的,它總是顯示在最後。

如果某個方法不是MT安全的(多線程安全或可重入),則應查找帶有後綴_r(表示reentrand)的相同方法。在你的例子中,strtok_r()按照其他答案中的建議。