Kisser Leon

这个kisser不太冷
posts - 100, comments - 102, trackbacks - 0, articles - 0

多线程学习中碰到的一个很有意思的问题

Posted on 2007-03-27 21:24 kk 阅读(4774) 评论(11)  编辑 收藏 引用 所属分类: IT

#include <stdio.h>
#include <windows.h>

const int numThreads = 3;

 

DWORD WINAPI helloFunc(LPVOID pArg)

{

       int num = (int) pArg;

       printf("Hello Thread %d\n", num);

      

       return 0;

}

 

int main()

{     

       HANDLE hThread[numThreads];

 

       for (int i = 0; i < numThreads; i++)

       {

              hThread[i] = CreateThread(NULL, 0, helloFunc, (LPVOID)i, 0, NULL);

       }

 

       WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE);

 

       return 0;

}

 

上面可以说是一个最简单的多线程程序了。

运行时库选项:

(1)       单线程调试 (/MLd)

(2)       多线程调试 DLL (/MDd)

(3)       多线程调试 (/MTd)

上面三个是 debug 版本的,还有与它们相对的三个 release 版本等。

由于一开始的时候系统默认的是 /MLd ,所以产生一些很有意思的问题,比如说有些线程 的线程函数会被执行多次:

Hello Thread 1

Hello Thread 1

Hello Thread 0

Hello Thread 2

Press any key to continue

线程 1 被执行了两次!

Hello Thread 0

Hello Thread Hello Thread 1

Hello Thread Hello Thread 1

2

Press any key to continue

这个就更奇怪了!虽然是因为有 race condition 在,但是为什么会多出一个 Hello Thread 呢( 5 Hello Thread 4 个数字)?那就只有一个原因,有一个数字被覆盖了(难道会有可能没来得及输出吗?)!

Intel Thread Checker 进行 check 的时候,会发生下面这样的问题,甚是奇怪!

图片传不上来。下次再传。终于上传成功了,娃哈哈
P1.bmp


碰到这么多问题,因为偶是初学者,所以就一直没有察觉出来编译选项设置有问题。而