**同事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...