【问题标题】:redirect standard output to a file using multiple thread使用多线程将标准输出重定向到文件
【发布时间】:2010-11-08 10:24:05
【问题描述】:

出于调试目的,我尝试将标准输出 (cout) 重定向到文件

std::ofstream traceFile;
traceFile.open("c:/path/file.txt");
std::streambuf* fileBuff = traceFile.rdbuf();

std::cout.rdbuf(fileBuff);

std::cout << std::unitbuff;

std::cout << "disk is written\n";

但是从新线程调用 cout 会使代码卡在互斥体上。 (xmtx.c 39: _Mtxlock())。

你有什么想法,我该如何解决?

谢谢

【问题讨论】:

    标签: c++ file std cout ostream


    【解决方案1】:

    这个example 对我来说很好用,而你的测试用例却不行。在我的机器上,您的代码似乎从文件中双重释放了 streambuf,而此示例在调用析构函数之前将其交换回来。

    【讨论】:

    • 是的,这很愚蠢,有时 ofstream 对象会在新线程调用 std::cout 之前超出范围。我想我需要更多的睡眠。谢谢
    【解决方案2】:

    可能您需要将 cout 的 streambuf 重置为原始。

    std::ofstream traceFile;
    traceFile.open("c:/path/file.txt");
    std::streambuf* fileBuff = traceFile.rdbuf(), *origBuf;
    
    origBuf = cout.rdbuf(); //Save cout's StreamBuf pointer
    std::cout.rdbuf(fileBuff); //Set cout's StreamBuf to file's StreamBuf pointer
    
    std::cout << std::unitbuff;
    
    std::cout << "disk is written\n";
    cout.rdbuf(origBuf);  //Reset cout's StreamBuf back to original
    

    另外,可能不允许多个线程同时写入同一个文件。 这可能是互斥量获取失败的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多