多线程中,相同功能的代码,C和C++给出的结果不同

C++语言 码拜 7年前 (2017-04-27) 1932次浏览
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <stdio.h>
using namespace std;
//子线程函数
DWORD WINAPI ThreadFun1(LPVOID pM1)
{
	cout << "子线程的线程ID号为:" << GetCurrentThreadId() << endl;
	cout << "Create by CreateThread!" << endl;
	cout << "Hello Thread!" << endl;
	return 0;
}
//unsigned int _stdcall ThreadFun2(PVOID pM2)
UINT _stdcall ThreadFun2(PVOID pM2)
{
	cout << "子线程的线程ID号为: " << GetCurrentThreadId() << endl;
	cout << "Create by _beginthreadex!" << endl;
	cout << "Hello Thread!" << endl;
	return 0;
}
//子线程函数报数
int g_count = 0;			//定义一个全局变量
UINT _stdcall ThreadFun3(PVOID pM3)
{
	g_count++;
	//cout << GetCurrentThreadId() << "报数: " << g_count << endl;
	printf("线程%d报数%d\n", GetCurrentThreadId(), g_count);
	return 0;
}
int main()
{
	const int threadNUM = 10;		//创建10个子线程进行轮流报数
	HANDLE handle = CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
	WaitForSingleObject(handle, INFINITE);
	cout << endl;
	HANDLE handle_begin = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, NULL, 0, NULL);
	WaitForSingleObject(handle_begin, INFINITE);
	cout << endl;
	HANDLE handle_count[threadNUM];
	for (int i = 0; i < threadNUM; i++)
	{
		handle_count[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun3, NULL, 0, NULL);
	}
	WaitForMultipleObjects(threadNUM, handle_count, true,INFINITE);

	return 0;
}

C代码运行结果如下:
多线程中,相同功能的代码,C和C++给出的结果不同
而将ThreadFun3中输出语句C代码换成C++后运行结果如下:
多线程中,相同功能的代码,C和C++给出的结果不同
在最后一个报数功能上,C++输出代码显示的很乱。
这是什么原因?

解决方案

10

这是原因是cout和printf对输出缓冲区的使用、控制是不同的。
多个线程向控制台输出文本,就涉及到资源(控制台)的占用的问题,不加锁控制,输出顺序错乱是正常的,不要被第一个程序的正常顺序所迷惑(这是不正常的)

10

UINT _stdcall ThreadFun3(PVOID pM3)
{
g_count++;
//cout << GetCurrentThreadId() << “报数: ” << g_count << endl;
printf(“线程%d报数%d\n”, GetCurrentThreadId(), g_count);
return 0;
}
这个方法没有加锁,各个线程是交叉着运行该方法的,
例如线程1   执行了 g_count++;还未调用printf打印  ,此时线程2又调用了 g_count++;  那么线程1调用print后输出的数据就是
“  线程xx报数  2 ”

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明多线程中,相同功能的代码,C和C++给出的结果不同
喜欢 (0)
[1034331897@qq.com]
分享 (0)