1

私のアプリケーションでは、データをfile1に継続的に書き込み、それをデバイスにフラッシュしています。別のスレッドで、file1からデータを読み取り、 file2に書き込みます。

file1 でfwrite + fflushを実行するたびに、他のスレッドにシグナルを送信して、そこから読み取りを開始します。もう 1 つのスレッドは、file1 からデータを読み取り、それを file2 にダンプします。かなり単純なロジック。さらに、数分ごとに file1 の先頭に戻り、古いデータの上書きを開始します。

ここで私の問題は、file1のデータの上書きを開始すると、ライタースレッドが新しいデータを書き込んだ (およびフラッシュした)ことを通知したにもかかわらず、 file2 に読み取られたデータが古いデータ (つまり、前の反復で書き込まれたデータ) になる場合があることです。

[C + Linux + arm プラットフォーム] でソリッド ステート ドライブ (128 GB SAMSUNG 470 シリーズ) に読み書きしています。プロセッサのキャッシュに問題があるように感じます。おそらく、書き込みはキャッシュに送られ、リーダー スレッドによる読み取りはフラッシュから行われるため、古いデータになります。

ここでの問題は、SSD が NTFS でフォ​​ーマットされている場合にこの問題が発生することです。ext3 でフォーマットすると、問題はなくなります。残念ながら、NTFS は厳しい要件です。もう 1 つの興味深い観察結果は、2 つのリーダー スレッドがある場合、両方が異なる時点で古いデータを取得することです。

SSD 書き込みキャッシュを ( hdparm -W0 /dev/sda1で) 無効にした後、NTFS でも同じ問題が発生します。私は1週間以上これにひどく立ち往生しています。

何が起こっているのか、なぜそのように起こっているのですか?

どんな助けも、その重さの金に値するでしょう...

編集NTFS ドライバーは、ファイル ポインターを巻き戻してファイルを上書きすることを好まないことがわかりました。これは既知のことですか?

4

1 に答える 1

0

さて、私は自分で問題を見つけました(そして、それが起こることはめったにありません!!!)。

C ライブラリのバッファリング (fread/fwrite) に問題があることがわかりました。したがって、すべての fread() の前に fflush() を実行します。これは私の問題を解決します (ドライバーで何が問題になったのか正確にはわかりませんが、ファイルの同じ場所から読み取るときに、C ライブラリ I/O 関数の「読み取り」バッファリングに問題があると想定しています二回目)。

@Asad Rasheed と @jrtipton の入力に感謝します :)

于 2011-10-10T12:55:58.540 に答える