6

Google のロギング ライブラリ (glog-0.3.2) を使用して、ログに送信される個々のエントリはミューテックスによってラップされていますか? つまり、現在保存されているエントリが他のエントリによって破損する可能性はありますか?

私はそれが次のように翻訳されると思います: is glog threadsafe?

また、ロガーがファイルだけでなくコンソールにもエコーするように設定されている場合、独自のミューテックスを持たない限り、からの出力をブロックprintf/cout破損する方法はありますLOG()か? おそらく、複数のステートメントをラップできるミューテックスをロックする方法があるのではないかと思いました。

4

2 に答える 2

16

残念ながら、glog ドキュメントの「Raw Logging」情報は誤解を招くものです。raw_logging は、GLOG の機能が制限されたロギング メカニズムであり、デッドロックが発生しやすい状況やその他の再入可能な状況で役立ちます。

logging.h と logging.c を見ると、glog の通常のフル機能のロギングもスレッドセーフであることがわかります。これは次のように達成されます。

  • glog は、2 つの異なるスレッド間での出力のインターリーブ (fwrite() または write() で発生する可能性がある) を防ぐために、各 LOG 行に対して新しい一意のログ オブジェクトを作成するという方法をとっています。
  • glog は、完了したログ行をログ シンクのキューに入れるときにミューテックスを取得します。
  • glog では、ログ シンクがスレッド セーフである必要があります。
于 2012-11-09T00:15:06.087 に答える
3

はい、glogはスレッドセーフにすることができます。

生のロギング

ヘッダーファイルは、メモリを割り当てたり、ロックを取得したりしないスレッドセーフなロギングに使用できます。したがって、このヘッダーファイルで定義されているマクロは、低レベルのメモリ割り当ておよび同期コードで使用できます。詳細については、src / glog/raw_logging.h.inを確認してください。

http://google-glog.googlecode.com/svn/trunk/doc/glog.html

于 2012-07-13T19:54:48.503 に答える