2010-11-08 79 views
1

我試圖重定向非標準輸出(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())。

你有沒有想法,我該如何解決它?

謝謝

回答

1

example正常工作對我來說,雖然你的測試用例沒有。在我的機器上,您的代碼似乎將文件中的streambuf加倍釋放,而此示例在調用析構函數之前將其交換回來。

+0

是的,這是愚蠢的,有時在新的線程調用std :: cout之前,ofstream對象超出範圍。我想我需要更多的睡眠。謝謝 – MiniScalope 2010-11-08 12:09:31

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 

此外,可能不允許同時由多個線程寫入同一文件。 這可能是獲取互斥鎖失敗的原因。

相關問題