建立執行緒時的幾個陷阱
前幾天幫同事查乙個多執行緒的bug,不到十秒鐘我就找到了問題的根源。n年前我曾犯過類似的錯誤,呵,今天仍然有人在重複。這些問題都比較典型,把它們寫出來,供新手參考吧。 l
用臨時變數作為執行緒引數的問題。
#include
#include
#include
void* start_routine(void* param)
pthread_t create_test_thread()
int main(int argc, char* argv)
分析:由於新執行緒和當前執行緒是併發的,誰先誰後是無法**的。可能
create_test_thread
已經執行完成,str已經被釋放了,新執行緒才拿到這引數,此時它的內容已經無法確定了,自然列印出的字串是隨機的。 l
執行緒引數共享的問題。
#include
#include
#include
void* start_routine(void* param)
#define threads_nr 10
void create_test_threads() ;
for(i = 0; i < threads_nr; i++)
for(i = 0; i < threads_nr; i++)
return ; }
int main(int argc, char* argv)
分析:由於新執行緒和當前執行緒是併發的,誰先誰後是無法**的。i在不斷變化,所以新執行緒拿到的引數值是無法預知的,自然列印出的字串也是隨機的。 l
虛假併發。
#include
#include
#include
void* start_routine(void* param)
#define threads_nr 10
void create_test_threads() ;
for(i = 0; i < threads_nr; i++)
return ; }
int main(int argc, char* argv)
分析:因為pthread_join會阻塞直到執行緒退出,所以這些執行緒實際上是序列執行的,乙個退出了,才建立下乙個。當年乙個同事寫了乙個多執行緒的測試程式,就是這樣寫的,結果沒有測試出乙個潛伏的問題,直到產品執行時,這個問題才暴露出來。
建立執行緒時的幾個陷阱
同事makcy的blog 前幾天幫同事查乙個多執行緒的bug,不到十秒鐘我就找到了問題的根源。n年前我曾犯過類似的錯誤,呵,今天仍然有人在重複。這些問題都比較典型,把它們寫出來,供新手參考吧。l 用臨時變數作為執行緒引數的問題。include stdio h include include asse...
建立執行緒時的幾個陷阱
建立執行緒時的幾個陷阱 前幾天幫同事查乙個多執行緒的 bug,不到十秒鐘我就找到了問題的根源。n年前我曾犯過類似的錯誤,呵,今天仍然有人在重複。這些問題都比較典型,把它們寫出來,供新手參考吧。l 用臨時變數作為執行緒引數的問題。include stdio h include include asse...
執行緒建立時的問題思考
有一段 1 include 2 include 3 include 4 include 5 include 6 pthread t ntid 7void printids const char s 816 void thr fn void arg 1721 int main void 22 30 p...