注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

dingchaoqun12 的博客

上海股票期货开户

 
 
 

日志

 
 
 
 

多线程下控制台输出乱序的问题_autumnrain_新浪博客  

2012-05-24 13:08:45|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

多线程下控制台输出乱序的问题_autumnrain_新浪博客 - dingchaoqun12 - dingchaoqun12 的博客 (2008-08-08 13:20:44)
标签:

多线程

控制台输出

分类: 多线程
#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 );

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



引文来源  多线程下控制台输出乱序的问题_autumnrain_新浪博客
  评论这张
 
阅读(839)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017