建立執行緒時的幾個陷阱

2021-09-30 03:38:42 字數 1745 閱讀 5394

建立執行緒時的幾個陷阱

前幾天幫同事查乙個多執行緒的

bug,不到十秒鐘我就找到了問題的根源。

n年前我曾犯過類似的錯誤,呵,今天仍然有人在重複。這些問題都比較典型,把它們寫出來,供新手參考吧。 l

用臨時變數作為執行緒引數的問題。

#include

<

stdio

.h>

#include

#include

<

assert

.h>

void

* start_routine

(void

* param

)pthread_t

create_test_thread

()int

main

(int

argc

, char

* ar**)

分析:由於新執行緒和當前執行緒是併發的,誰先誰後是無法**的。可

能create_test_thread

已經執行完成,

str已經被釋放了,新執行緒才拿到這引數,此時它的內容已經無法確定了,自然列印出的字串是隨機的。 l

執行緒引數共享的問題。

#include

<

stdio

.h>

#include

#include

<

assert

.h>

void

* start_routine

(void

* param

)#define

threads_nr

10void

create_test_threads();

for(

i= 0;

i<

threads_nr; i

++)for(i

= 0;

i<

threads_nr; i

++)return;}

intmain

(int

argc

, char

* ar**)

分析:由於新執行緒和當前執行緒是併發的,誰先誰後是無法**的。

i在不斷變化,所以新執行緒拿到的引數值是無法預知的,自然列印出的字串也是隨機的。 l

虛假併發。

#include

<

stdio

.h>

#include

#include

<

assert

.h>

void

* start_routine

(void

* param

)#define

threads_nr

10void

create_test_threads();

for(

i= 0;

i<

threads_nr; i

++)return;}

intmain

(int

argc

, char

* ar**)

分析:因為

pthread_join

會阻塞直到執行緒退出,所以這些執行緒實際上是序列執行的,乙個退出了,才建立下乙個。當年乙個同事寫了乙個多執行緒的測試程式,就是這樣寫的,結果沒有測試出乙個潛伏的問題,直到產品執行時,這個問題才暴露出來。

聞香止步**木雕飾品 收集:

建立執行緒時的幾個陷阱

建立執行緒時的幾個陷阱 前幾天幫同事查乙個多執行緒的bug,不到十秒鐘我就找到了問題的根源。n年前我曾犯過類似的錯誤,呵,今天仍然有人在重複。這些問題都比較典型,把它們寫出來,供新手參考吧。l 用臨時變數作為執行緒引數的問題。include include include void start ro...

建立執行緒時的幾個陷阱

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