#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);
}
二、使用多线程库进行编译
虽然还是乱序执行(这是跟线程本身有关的),但是只会打印四行。