2 つのスレッドが同時に open() を呼び出しても大丈夫ですか? この質問に対する答えはどのように見つけられるでしょうか。
O_RDONLY
呼び出しが異なるファイルで動作していて、それらのフラグが、O_WRONLY
、またはその両方であると仮定します。
2 つのスレッドが同時に open() を呼び出しても大丈夫ですか? この質問に対する答えはどのように見つけられるでしょうか。
O_RDONLY
呼び出しが異なるファイルで動作していて、それらのフラグが、O_WRONLY
、またはその両方であると仮定します。
これは、オペレーティング システムと C ランタイム ライブラリによって異なります。POSIX.1-2001 または POSIX.1-2008 に準拠している場合は、 http ://www.kernel.org/doc/man-pages/online/pages/man7/pthreads.7 に従ってスレッドセーフである必要があります。 .html
他の人が指摘したように、システム コールがスレッド セーフである可能性があるからといって、何でもできるわけではなく、呼び出しが魔法のように解決してくれると期待できるわけではありません。適切な同期なしで異なるスレッドから同じファイルを読み書きすると、結果は不確定になります。このコンテキストでのスレッド セーフとは、読み取りと書き込みが実行されることを意味します。別の考え方としては、呼び出しが異なるプロセスで行われた場合と同じ保証が得られるということです。open() などのシステム コールが「プロセス セーフ」であることを誰もが期待しています。
これらは別のファイルであることに注意してください。問題はありません。
2 つの異なるプロセスが 2 つの異なるファイルを開くのと同じです。
編集:以下のコメントで Guy が指摘しているように、これは常に当てはまるとは限らないことを言及するのは公正でしょう。使用している がスレッドセーフかどうかによって異なりlibc
ます。現代の化身はopen()
呼び出しに関するものです。
それらが同じファイルであるか異なるファイルであるかは、実際にはニシンです。Unix ライクな OS で実行している場合、open() が直接のシステム コールである場合、答えは絶対にイエスです。異なるプロセスと同じように、異なるスレッドがファイル (または同じファイル) を同時に開くことができます。
ユーザー空間で open() をエミュレートするシステムで実行している場合、非スレッド セーフの原因として考えられるのは、OS から返されたファイル ハンドルを、Unix が提供する小さな整数のファイル記述子にマップするファイル記述子テーブルです。 -like open() 呼び出しが返されます。別の投稿者が指摘したように、POSIX は open() がスレッドセーフであることを要求しており、open() は一般に POSIX 互換性を提供するために実装されているため、安全です。
非常に古くてぎこちない C ライブラリが非スレッドセーフな open() を提供する可能性は考えられますが、実際に遭遇する可能性はほとんどありません。特に POSIX スレッドを使用している場合。
場合によります。あなたは読書のために開いていますか?それなら安全です。書き込み用に開いている場合は、スレッドを同期する必要があります。