zoukankan      html  css  js  c++  java
  • std::cout和printf

       禁止std::cout和printf混用,在多线程环境下可能导致coredump。

    说明:printf和std::cout分别为标准c语言与c++中的函数,两者的缓冲区机制不同(printf无缓冲区,而std::cout有),而且对于标准输出的加锁时机也略不同:

    (1)printf:在对标准输出作任何处理前先加锁。

    (2)std::cout:在实际向标准输出打印时方才加锁。

        两者存在微弱的时序差别,而多线程环境下,很多问题就是由于微弱的时序差别造成的。所以两者的混用很容易带来不可预知的错误,常见的错误有打印输出的结果不符合预期,而严重错误时甚至会导致内部缓冲区溢出,导致coredump。

    例如:

        void Nocomplaint()

    {

      int j=0;

      for(j=0;j<5;j++)

     {

       cout << "j=";

       printf("%d ",j);

     }

    }

    上面代码的输出结果可能为:1 2 3 4 j=j=j=j=j=

       造成这样的错误的原因就是std::cout的标准流输出时带有缓冲区的,如果没有及时清理缓冲区而在期间采用了其他系统的输出函数。可能会暴露两种输出函数的不兼容性,从而出现非预期错误。

  • 相关阅读:
    易飞审核接口下载
    易飞ERP和钉钉办公集成——ERP移动审批解决方案
    Delphi XE----Rtti单元一(TRttiContext)
    Delphi XE
    Delphi XE
    Delphi XE -TCharHelper
    多线程编程
    bacula自动恢复测试脚本
    Bacula监控设置告警Zabbix篇
    Bacula监控设置邮件告警Message篇
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332734.html
Copyright © 2011-2022 走看看