有一段**
1 #include 2 #include3 #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(constchar *s)
main函式中開啟多個執行緒
1for(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...