使用平台: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才對嗎