複数のスレッドを使用してファイルに標準出力をリダイレクトします

StackOverflow https://stackoverflow.com/questions/4122991

  •  29-09-2019
  •  | 
  •  

質問

デバッグのために、StandART出力(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())。

あなたはアイデアを持っていますか、私はそれをどのように解決することができますか?

ありがとうございました

役に立ちましたか?

解決

これ あなたのテストケースはそうではありませんが、私にとっては正常に動作します。私のマシンでは、コードはファイルからStreamBufを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

また、複数のスレッドで同じファイルに同時に書き込むことは許可されない場合があります。それが、Mutexの取得の失敗の理由かもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top