使用多个线程将标准输出重定向到文件

时间:2010-11-08 10:24:05

标签: c++ file std cout ostream

我尝试将标准输出(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())。

你有什么想法,我怎么能解决它?

谢谢

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

可能需要将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

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