最近有同事在使用多线程的时候发现的一个问题,情况是这样的:操作系统是双核cpu,采用VC6.0为编译环境,下面是源程序和运行结果,注:每次运行结果不一致
#include <iostream>
#include <string>
#include<windows.h>
#include <pthread.h>
#include <cstdio>
using namespace std;
HANDLE a;
HANDLE b;
int abc()
{
int b;
for(b=0;b<1000;b++)
{
b+=1;
}
printf("b=%d\n", b);
//cout<<"b="<<b<<endl;
return 0;
}
DWORD WINAPI aa(LPVOID lpParam)
{
printf("aa start\n");
//cout<<"aa start"<<endl;
fflush(stdout);
abc();
//cout<<"aa end"<<endl;
printf("aa end\n");
fflush(stdout);
return 0;
}
DWORD WINAPI bb(LPVOID lpParam)
{
//cout<<"bb start"<<endl;
printf("bb start\n");
fflush(stdout);
abc();
//cout<<"bb end"<<endl;
printf("bb end\n");
fflush(stdout);
return 0;
}
int main()
{
b = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)bb, NULL, NULL, NULL);
a = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)aa, NULL, NULL, NULL);
Sleep(1000);
return 0;
}
结果截图:
分析: 线程理想结果是只执行一次,但是一个线程函数里重复打印了同一条语句"bb start",然后经过多次试验,发现如果是在 单核的CPU上就不会出现问题,还有一个就是现在里面的打印语句是c语言的API,但是程序是C++的,C和C++程序混用打印语句又可能会出现这个bug,换回来cout就没问题了,不会多打,但是又出现新问题,如下截图:
虽然没多打了,但是感觉打印的顺序不按套路出牌,因为这就是多核多线程的结果,因为是打印输入,中间有个时间间隔,具体的得看API里面的打印实现了,不过从中得出结论是:不要C和C++的打印输出语句混用,可能会出现意想不到的情况发生