看板 C_and_CPP 關於我們 聯絡資訊
使用平台:Visual Studio 2010 C++ Win32 API 各位大大好 最近找到了本書 視窗程式設計函式庫-Win 32 API(上/下) 裡面講各種API函數的使用,講得算很詳細而且易懂 看到他在介紹Thread的章節用的範例有點疑問 這個範例流程大概是這樣的 先開一個主視窗,然後設定主視窗接收到某個命令後(按下某個按鈕或Menu) 用CreateThread開一個子執行緒出來 例如以下 LRESULT CALLBACK WndProc(....) . . . if (HIWORD(wParam) == BN_CLICKED) { TCHAR szBuff[10]; hChild1=CreateThread(NULL,0,ThreadProc1,NULL,0,&dwID); wsprintf(szBuff,L"i=%d",i++); MessageBox(hWnd,szBuff,L"主執行緒",MB_OK); } DWORD WINAPI ThreadProc1(LPVOID lpParam) { TCHAR szBUFF[10]; wsprintf(szBuff,L"i=%d",i++); MessageBox(hWnd,szBuff,L"子執行緒",MB_OK); return 0; } i是一個Global變數,初始值為1 這兩個函數基本上都在做一樣的是,就是把i寫出來 看Thread執行的順序 先執行的Thread其MessageBox印出來的i會是1,而後執行的會是2 照書上所說因為CreateThread的第五個引數為0 所以CreateThread後會直接跳掉ThreadProc1內執行完畢再回到CreateThread的下一行 所以標題為"子執行緒"的MessageBox裡面的i應該會是1才對 但實際上跑出來的結果是相反,書上秀出的執行結果圖片也是這樣 但他也沒多做解釋 我有試過在主執行緒的MessageBox再加上一行i++ 但子執行緒的MessageBox卻依然是2!? 也就是ThreadProc1的執行時機是在主執行緒的MessageBox之後 但第二個i++之前? 這樣怎麼說都說不通呀 另外我也試過印出兩個Thread的GetCurrentThread,竟然是一樣的值? 主執行緒跟子執行緒不是應該屬於兩個不同的Thread才對嗎 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.115.41.202 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1457613805.A.2F9.html
freaky: 叫你在thread裡面丟message box的書可以不用看了 03/10 22:30
w0005151: 蛤 為什麼@@ 03/10 23:10
w0005151: 我後來開了個console應用程式試了一下 03/10 23:14
w0005151: 執行三次CreateThread,都是指向同一個ThreadProc 03/10 23:15
w0005151: ThreadProc的開頭跟結尾都是cout<<i++ i同樣也是全域 03/10 23:15
sorkayi: 跨執行序 存取變數問題 可google 03/10 23:16
w0005151: 結果顯示出來的並非123456,而且每次順序都不一樣@@ 03/10 23:16
freaky: 這篇文章點出一些問題:http://goo.gl/HO7X94 03/11 01:41
freaky: 看起來是很簡單的東西,其實背後很複雜 03/11 01:42