多线程时控制台输出乱序的问题

17 篇文章 0 订阅
1 篇文章 0 订阅
我看到很多人对这样一个问题寻求帮助:在多线程时,往控制台窗口输出的内容是乱序的。举个非常简单的例子,如下:

#include "stdafx.h"
#include <Windows.h>
using namespace std;

DWORD WINAPI ThreadProc1(
                        LPVOID lpParameter
                        )
{
    int i=0;
    while ( i<20 )
    {
        cout<<"first thread cout:"<<i<<endl; //往控制台窗口输出
        i++;
        Sleep(200);
    }
    return 0;
}

DWORD WINAPI ThreadProc2(
                         LPVOID lpParameter
                         )
{
    int i=0;
    while ( i<20 )
    {
        cout<<"second thread cout:"<<i<<endl; //往控制台输出
        i++;
        Sleep(200);
    }
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hThread[2];
    hThread[0] = CreateThread( NULL, NULL, ThreadProc1, NULL, NULL, NULL );
    hThread[1] = CreateThread( NULL, NULL, ThreadProc2, NULL, NULL, NULL );
    WaitForMultipleObjects(2, hThread, TRUE, INFINITE );
    return 0;
}


创建了两个子线程,每个子线程各自输出内容。运行结果:控制台上输出的内容是乱序的,而且每次结果不尽相同。


原因:往控制台窗口输出的过程(cout)并不是多线程安全的,在一个线程输出过程中另一个线程也可以输出。
解决办法:对输出出进行同步,利用临界区就可以很容易办到。代码修改如下:

CRITICAL_SECTION g_CS;  //定义一个临界区

InitializeCriticalSection( &g_CS ); //在程序开始的地方,对临界区初始化



在所有涉及到输出的地方改为:

        EnterCriticalSection( &g_CS );
        cout<<"first thread cout:"<<i<<endl;
        LeaveCriticalSection( &g_CS );

总结:在编写多线程的程序时,一定要特别注意同步的问题,仔细的考虑清楚哪些变量、资源、操作需要进行同步,否则就会得到莫名其妙的结果。

转自:http://blog.sina.com.cn/s/blog_4e2d49620100a252.html


  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值