I/O 関数はO_SYNC
アトミックを使用していますか? 例えば:
fd = open("user.data", O_RDONLY | O_SYNC);
pread(fd, &buf, sizeof(User), 100*sizeof(User));
この場合、pread
アトミックですか?注: ファイル ロック リックflock
またはfcntl
.
何に関してアトミック?
いいえ、ほとんどの場合、データはオペレーティング システムによってシリアルにプログラムにコピーされます。他のスレッドでは、一度に更新のチャンクが表示される場合と表示されない場合があります。buf へのアクセスを保護する場合は、セマフォまたはミューテックスを使用してアクセスをシリアル化する必要があります。これは非常に小さな読み取りではうまくいくかもしれませんが、少なくとも 100 バイトを実行しているので、いかなる場合でもそれに頼るべきではありません。
pread() は、同じファイル記述子で一度に複数のスレッドで使用できます。それが設計された理由かもしれないと思います。もちろん、各スレッドには、データを保持するための独自のバッファーが必要です。
O_SYNC は読み取りにはあまり役に立ちません。O_SYNC を書き込みで使用すると、呼び出しの最後にバッファ内のデータがフラッシュされることを意味します。これは、ディスク上に存在することを意味する場合もあれば、接続を介してフラッシュされたことを意味する場合もあります。読み取りの場合、O_RSYNC を使用する必要がある場合があります。O_RSYNC は、必要なメタデータの更新が完了するまで読み取り呼び出しを強制的にブロックします。この例は、「アクセス時間」が記録されたファイルシステムです。