#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代码运行结果如下:
而将ThreadFun3中输出语句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 ”
{
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 ”