[问题] 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