以下代码在执行的时候,有时会打印出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);
}
二、使用多线程库进行编译
虽然还是乱序执行(这是跟线程本身有关的),但是只会打印四行。
#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);
}
二、使用多线程库进行编译
虽然还是乱序执行(这是跟线程本身有关的),但是只会打印四行。
相关文章推荐
- 写出以下代码执行结果,分析为什么?(没有分析结果不得分)
- 编写html表格输出的时候有时候会出现同一列连续出现两行或者是三行的数据内容一样,并且我们想将这些行合并起来,这个时候我们就需要以下这些代码
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
- 两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
- Hadoop中Reducer对输出的结果执行乘法或者加法的时候为什么都是执行两次
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?
- 关于360笔试题的一个题目的以下代码执行后输出结果为()思考
- 两个线程并发执行以下代码,假设a是全局变量,那么以下输出___哪个是可能的?
- 以下代码中的输出语句输出0吗,为什么?
- 实现 java 执行 cmd 命令,打印输出,等待cmd 完全执行完成后才执行下面代码 .
- 实现 java 执行 cmd 命令,打印输出,等待cmd 完全执行完成后才执行下面代码
- 黑马程序员——写出以下代码执行结果,分析为什么?(没有分析结果不得分)
- JAVA编程自学不解:为什么打印输出不是孙悟空?
- ★实验 9-2 1. 补全代码,实现以下功能 a) 调用pipe()创建无名管道 b) 调用fork创建一个子进程 c) 在父进程中向管道写入 “helloworld”, 同时打印出PID和写入
- 求助 这是我的mfc下一个修改数据库信息的一段代码,里面执行到m_Ado.m_pRecordset->Update(); 这句话的时候就会出现异常,而且修改不了数据库内的信息。
- 选择某种Map集合保存学号从1到15的学员的学号(键)和姓名(值),学号用字符串表示,输入的时候要以学号乱序的方式存入Map集合,然后按照学号从大到小的顺序将Map集合中的元素输出打印。需要自定义Ma
- 2013-12-17Project : error PRJ0019: 某个工具从以下位置返回了错误代码: "正在执行生成后事件...
- 为什么重载输出流符号的时候一定要返回引用
- javascript中为什么有时需要创建立即执行的函数
- 没有被调用的函数其代码为什么会被执行?