4

Linux、Unix、および OSX で実行したいコードの変更を検討しています。コードには sem_init の呼び出しがいくつかありますが、pshared 値はゼロに設定されています。UNIXプログラミングに関するRochkindの本を読んだところ、彼は基本的に、共有されていないsem_initはメモリ内のバイナリ方式で動作するため、pthread_mutex_initと同じだと言いました。

問題は、これらの sem_init を pthread_mutex_init に変更したり、sem_open を使用してこのコードのより移植性の高いバージョンを取得したりしても安全でしょうか?

OSX は無名セマフォをサポートしていませんが、他の 2 つのセマフォはサポートしていると思います。私は本当に別のコンパイルフラグを持ちたくありません#ifdef(__APPLE__)

ありがとう

4

3 に答える 3

10

ミューテックスとセマフォはセマンティクスが異なります。ミューテックスは、ロックを取得した同じスレッドによってロック解除される必要があります。そのため、ロックとロック解除常に同じスレッド内でペアで行う必要があります。

セマフォは、別のスレッドが別のスレッドが消費するトークンをポストできるという点で、はるかに柔軟です。それらは、たとえば、生産者/消費者パターンを実装するために一般的に使用されます。そのため、移植するプログラムがミューテックスの制限されたセマンティックに適合するかどうかを確認する必要があります。

于 2012-07-25T22:36:48.893 に答える
2

ミューテックスとセマフォのセマンティクスは異なります。非共有セマフォがバイナリ セマフォとしてのみ使用される場合、つまりその値が 1 より大きくならない場合、ミューテックスと同等であることは事実です。初期化されます。セマフォがバイナリ セマフォとしてのみ使用されることが確実な場合は、pthread ミューテックスが完全な代替手段となります。そうでない場合は、移植性のために sem_open() を使用するか、pthread ミューテックスと条件変数を使用してセマフォをエミュレートするラッパーを作成できます。

于 2012-07-25T21:52:50.443 に答える
1

ミューテックスへの切り替えは、特定のインスタンスで安全である必要があります。特定のクリティカルセクションに一度に入ることができるスレッドが1つだけの場合、セマフォとして記述されているかどうかに関係なく、実質的にミューテックスがあります。ただし、OSによる機能の実装方法によっては、パフォーマンス特性が異なる場合があります。それは私が眠りにつくようなものではありませんが、それでもテスト中にあなたの心の後ろに置いておくべきものです。

于 2012-07-25T21:45:00.817 に答える