2012-04-18 4 views
0

コードスニペット:1つのスレッドがファイルに書き込み、その2つのスレッドが同時に書いていないファイルをロックするC++スレッドセーフで開いたファイルを作成するには?

ofstream log; 
log.open("log.txt",ios::out); 
Thread threads[2]; 
...both threads write to the file 
log.close() 

既存の施設。ありがとう。

+0

ロギングフレームワークを使用すると、これが処理されます。 _あなたが_それを自分でしたいのであれば、ミューテックス/ロックはあなたが探しているものです。 – bongi

+0

共有データ(ファイルログ)にロック、セマフォ、クリティカルセクションなどを使用できます。 – Kasma

+1

プロデューサ - コンシューマキューの1つの 'logWriter'スレッドへの書き込みをキューイングするだけで、この問題を回避できます。それはタイトルの問題を解決するだけでなく、ログの呼び出しからディスク待ち時間のようなものを取り、メインアプリが待たずに実行できるようにします。 –

答えて

0

pwrite()を使用すると、マルチスレッドで安全に書き込むことができます。シャンが言ったよう

+0

どのように説明できますか?擬似コードは素晴らしいでしょう。 – user1147800

0

pwritewriteと同じアクションを実行しますが、ファイルポインタを変更することなく、ファイル内の指定された位置に書き込み、したがってスレッドで安全です。

詳細については、man pwrite(2)を参照してください。あなたのケースでは

int fd = open('some_file',O_WRONLY); 
/* in threads */ 
n = pwrite(fd, write_buffer, sizeof_buffer, file_offset); 

、あなたはおそらく書き込みの前にロックして、オフセットを追跡しているつもり(あなたがファイルのどこにいるか)、その後、競合状態が上書きしないようにロックを解除していますファイルの既存の部分と、ファイルとの間のすべてのアクションが並行してうまく動作します。

関連する問題