перенаправить стандартный вывод в файл, используя несколько потоков - PullRequest
1 голос
/ 08 ноября 2010

Я попытался перенаправить стандартный вывод (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 ]

1 голос
/ 08 ноября 2010

Этот пример отлично работает для меня, а ваш тестовый пример - нет.На моей машине ваш код, казалось, удваивает освобождение streambuf из файла, тогда как этот пример меняет его обратно перед вызовом деструкторов.

0 голосов
/ 08 ноября 2010

Может быть, вам нужно сбросить поток буфера cout на оригинальный.

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

Кроме того, одновременная запись в один и тот же файл несколькими потоками может быть запрещена. Это может быть причиной неудачи приобретения мьютекса.

...