コードスニペット:1つのスレッドがファイルに書き込み、その2つのスレッドが同時に書いていないファイルをロックするC++スレッドセーフで開いたファイルを作成するには?
ofstream log;
log.open("log.txt",ios::out);
Thread threads[2];
...both threads write to the file
log.close()
既存の施設。ありがとう。
コードスニペット:1つのスレッドがファイルに書き込み、その2つのスレッドが同時に書いていないファイルをロックするC++スレッドセーフで開いたファイルを作成するには?
ofstream log;
log.open("log.txt",ios::out);
Thread threads[2];
...both threads write to the file
log.close()
既存の施設。ありがとう。
、 pwrite
はwrite
と同じアクションを実行しますが、ファイルポインタを変更することなく、ファイル内の指定された位置に書き込み、したがってスレッドで安全です。
詳細については、man pwrite(2)を参照してください。あなたのケースでは
int fd = open('some_file',O_WRONLY);
/* in threads */
n = pwrite(fd, write_buffer, sizeof_buffer, file_offset);
、あなたはおそらく書き込みの前にロックして、オフセットを追跡しているつもり(あなたがファイルのどこにいるか)、その後、競合状態が上書きしないようにロックを解除していますファイルの既存の部分と、ファイルとの間のすべてのアクションが並行してうまく動作します。
ロギングフレームワークを使用すると、これが処理されます。 _あなたが_それを自分でしたいのであれば、ミューテックス/ロックはあなたが探しているものです。 – bongi
共有データ(ファイルログ)にロック、セマフォ、クリティカルセクションなどを使用できます。 – Kasma
プロデューサ - コンシューマキューの1つの 'logWriter'スレッドへの書き込みをキューイングするだけで、この問題を回避できます。それはタイトルの問題を解決するだけでなく、ログの呼び出しからディスク待ち時間のようなものを取り、メインアプリが待たずに実行できるようにします。 –