[問題] Win32 API thread問題

作者: w0005151 (藍廳)   2016-03-10 20:43:23
使用平台: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才對嗎
作者: freaky (jon)   2016-03-10 22:30:00
叫你在thread裡面丟message box的書可以不用看了
作者: w0005151 (藍廳)   2016-03-10 23:10:00
蛤 為什麼@@我後來開了個console應用程式試了一下執行三次CreateThread,都是指向同一個ThreadProcThreadProc的開頭跟結尾都是cout<<i++ i同樣也是全域
作者: sorkayi (尋找奶昔)   2016-03-10 23:16:00
跨執行序 存取變數問題 可google
作者: w0005151 (藍廳)   2016-03-10 23:16:00
結果顯示出來的並非123456,而且每次順序都不一樣@@
作者: freaky (jon)   2016-03-11 01:41:00
這篇文章點出一些問題:http://goo.gl/HO7X94看起來是很簡單的東西,其實背後很複雜

Links booklink

Contact Us: admin [ a t ] ucptt.com