您的位置:首页 > 编程语言

以下代码在执行的时候,有时会打印出5行甚至6行输出,为什么?(VC6.0)

2010-05-26 20:25 295 查看
#include<stdio.h>
#include<windows.h>
#define SIZE 4
//int count=1;
DWORD WINAPI helloFunc(LPVOID arg)
{
int *num=(int*)arg;
printf("Hello From Thread #%d/n",*num);
return 0;
}
main()
{
HANDLE hThread[SIZE];
int num[SIZE];
for(int i=0;i<SIZE;i++){
num[i]=i+1;
hThread[i]=CreateThread(NULL,0,helloFunc,(LPVOID)&num[i],0,NULL);
// Sleep(1);
}
WaitForMultipleObjects(SIZE,hThread,true,INFINITE);
// Sleep(1);
}

以下是我的试验结果,确实产生5行:

Hello From Thread #1
Hello From Thread #3
Hello From Thread #3
Hello From Thread #2
Hello From Thread #4
Press any key to continue

甚至还产生:

Hello From Thread #1
Hello FHello From Thread #3
Hello FHello From Thread #3
rom Thread #2
Hello From Thread #4
Press any key to continue

原因:

1.乱序执行:控制台窗口输出的过程往往不是多线程安全的,在一个线程输出过程中另一个线程也可以输出。

2.有些线程会执行多次:是因为选择单进程的库编译的,单进程的库是不可重入的。

解决办法:

一、加上临界区,之后代码如下:

#include<stdio.h>
#include<windows.h>
#define SIZE 4
//int count=1;
CRITICAL_SECTION g_CS; //定义一个临界区

DWORD WINAPI helloFunc(LPVOID arg)
{
int *num=(int*)arg;
EnterCriticalSection( &g_CS );
printf("Hello From Thread #%d/n",*num);
LeaveCriticalSection( &g_CS );

return 0;
}

void main()
{
HANDLE hThread[SIZE];
int num[SIZE];
InitializeCriticalSection( &g_CS ); //在程序开始的地方,对临界区初始化

for(int i=0;i<SIZE;i++)
{
num[i]=i+1;
hThread[i]=CreateThread(NULL,0,helloFunc,(LPVOID)&num[i],0,NULL);
//Sleep(1);
}
WaitForMultipleObjects(SIZE,hThread,true,INFINITE);
// Sleep(1);
}

二、使用多线程库进行编译
虽然还是乱序执行(这是跟线程本身有关的),但是只会打印四行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐