std::ifstream を使用して、多数のスレッドから 1 つのファイルを読み取るためのオープンを実行する予定です。私の懸念は、std::ifstream がスレッドセーフでロックフリーかどうかです。
詳細:
- Ubuntu と Windows XP では g++ 4.4、Leopard では 4.0 を使用しています。
- 各スレッドは std::ifstream の独自のインスタンスを作成します
前もって感謝します!
std::ifstream を使用して、多数のスレッドから 1 つのファイルを読み取るためのオープンを実行する予定です。私の懸念は、std::ifstream がスレッドセーフでロックフリーかどうかです。
詳細:
前もって感謝します!
それは実装定義です。標準 C++ は、スレッド化についてまったく何も述べていないため、スレッドに関する仮定は本質的に未指定または実装定義の動作を呼び出します。
使用しているプラットフォームをより具体的にする必要がありますが、ifstream がスレッドセーフまたはロックフリーであると仮定するのはおそらく不合理です。少なくとも、実際にファイルからの読み取りを行う OS レベルの呼び出しにロックが関与している可能性があります。この場合、真のロックフリーの実装は不可能です。それがなくても、ifstream から読み取るたびに、いくつかのフォーマット フラグをチェックする必要があり、読み取り中に発生した内容に応じてフラグ ビットを更新する必要があります。(つまりistream::good()
とistream::operator bool
) これらすべてをアトミックに行うことはできないため、istream
のスレッド セーフ特性について多くを想定するのは合理的ではありません。
http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_concurrency.htmlを参照してください。
そのマニュアル ページの執筆時点では、GCC の標準ライブラリは、オペレーティング システムの C stdio ファイル バッファリングに従います。それらは C 構造の外部に状態を保持することを避け、FILE
それによってある程度の安全性を達成します。
C stdio ライブラリはファイル内の最後の I/O 操作前後の単一範囲のバッファを実装しているため、ロックフリーの実装がどのように可能かわかりません。ファイルに対する操作は、連続して処理する必要があります。おそらく非バッファ モードが役立つでしょう。それは私が今やりたいことよりも少し多くの研究です.
すべての std ライブラリはスレッド セーフですが、「非同期」セーフではありません。したがって、同じオブジェクトではなく、異なるスレッドから同じ関数を呼び出すことができます。