c++多线程使用printf输出的bug

最近有同事在使用多线程的时候发现的一个问题,情况是这样的:操作系统是双核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++的打印输出语句混用,可能会出现意想不到的情况发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值