建立執行緒時的幾個陷阱

2021-05-26 18:15:44 字數 1227 閱讀 3834

建立執行緒時的幾個陷阱

前幾天幫同事查乙個多執行緒的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...