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

时间:2021-07-04 20:04:37

#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);
}

二、使用多线程库进行编译
虽然还是乱序执行(这是跟线程本身有关的),但是只会打印四行。