建立執行緒時的幾個陷阱

2021-08-22 20:23:29 字數 1911 閱讀 9188

**同事makcy的blog

<?xml:namespace prefix = o />

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

* argv)

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

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

* argv

)分析:由於新執行緒和當前執行緒是併發的,誰先誰後是無法**的。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

* argv

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

補充:用exit和wait理解pthread_exit和pthread_join

int getid()

假如外面有多個執行緒呼叫getid(),這個看起來貌似安全的函式其實是不安全的。

++id是安全的,但return id是不安全的。會導致多個執行緒獲取到相同的id。

安全的做法是:

int getid()

建立執行緒時的幾個陷阱

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

建立執行緒時的幾個陷阱

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