使用平台: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才对吗