執行緒建立時的問題思考

2022-03-26 23:11:35 字數 2235 閱讀 2556

有一段**

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 printids("

main thread:");

31 sleep(1

);32

return0;

33 }

這段**main函式中建立了乙個執行緒,如果建立失敗則輸出出錯資訊。

printids函式列印當前程序id和執行緒id

main函式的執行緒和新建立的執行緒都會呼叫printids,得到執行緒資訊。

編譯執行結果如下:

$ gcc main.c -lpthread

$ ./a.out

main thread: pid 7398 tid 3084450496 (0xb7d8fac0)

new thread: pid 7398 tid 3084446608 (0xb7d8eb90)

那麼問題來了:

主線程在乙個全域性變數 ntid 中儲存了新建立的執行緒的id,如果新建立的執行緒不呼叫

pthread_self 而是直接列印這個 ntid ,能不能達到同樣的效果?

正常情況下,如果直接使用全域性變數的ntid是可以得到新執行緒的thread_id的,但是如果**修改一下

void printids(const

char *s)

main函式中開啟多個執行緒

1

for(i=0;i<10;i++)

2

那麼輸出結果將會是非常凌亂的。

globel: ntid(2801985280) ntid(0xa702e700)  

new thread: pid 3545 tid 2810377984 (0xa782f700)

globel: ntid(2793592576) ntid(0xa682d700)

new thread: pid 3545 tid 2793592576 (0xa682d700)

globel: ntid(2751629056) ntid(0xa4028700)

new thread: pid 3545 tid 2760021760 (0xa4829700)

globel: ntid(2793592576) ntid(0xa682d700)

globel: ntid(2734843648) ntid(0xa3026700)

globel: ntid(2768414464) ntid(0xa502a700)

new thread: pid 3545 tid 2734843648 (0xa3026700)

globel: ntid(2768414464) ntid(0xa502a700)

new thread: pid 3545 tid 2801985280 (0xa702e700)

globel: ntid(2734843648) ntid(0xa3026700)

new thread: pid 3545 tid 2743236352 (0xa3827700)

new thread: pid 3545 tid 2776807168 (0xa582b700)

new thread: pid 3545 tid 2785199872 (0xa602c700)

globel: ntid(2768414464) ntid(0xa502a700)

new thread: pid 3545 tid 2768414464 (0xa502a700)

globel: ntid(2743236352) ntid(0xa3827700)

new thread: pid 3545 tid 2751629056 (0xa4028700)

globel: ntid(2734843648) ntid(0xa3026700)

main thread: pid 3545 tid 2818803520 (0xa8038740)

有時會連續輸出好幾個globel變數,之後才輸出乙個或者多new thread資訊。可見在多執行緒中,這種方法不總是實用的。

吃飯時在思考執行緒問題

歡迎登陸蓋因 瑞比作業系統.正在驗證你的身份.驗證成功,確認閣下為可瀏覽角色.系統初始化中.控制模組.禁用 共享資訊模組.禁用 人機互動模組.禁用 核心處理模組.禁用 日誌模組.可查詢 初始化成功.進入日誌檢視模式.最近一段系統日誌.發生於2009 10 29 17 21 51 0800.標題為 吃...

建立執行緒時的幾個陷阱

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

建立執行緒時的幾個陷阱

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