4

私は現在、社内で使用する pthreads の周りに薄い C++ ラッパーを構築しています。QNX と同様に Windows もターゲットにされており、幸いなことに pthreads-win32 ポートは非​​常にうまく機能しているように見えますが、QNX は実用的な目的のために POSIX に準拠しています。

今、セマフォを実装しながら、関数をヒットしました

sem_post_multiple(sem_t*, int)

これは明らかに pthreads-win32 でのみ利用可能ですが、QNX にはありません。名前が示すように、この関数は、2 番目の引数として指定された数だけセマフォをインクリメントすることになっています。私が知る限り、この関数は POSIX 1b にも POSIX 1c にも含まれていません。

現在、上記の関数の要件はありませんが、pthreads-win32 が関数を提供する理由と、それが役立つかどうかについてはまだ疑問に思っています。次のようなものを使用して、QNX でそれを模倣することができます。

sem_post_multiple_qnx(sem_t* sem, int count)
{
   for(;count > 0; --count)
   {
       sem_post(sem);
   }
} 

私が求めているのは、進め方についての提案/アドバイスです。コンセンサスが QNX の機能を実装することを提案している場合は、提案された抜粋されたコードが実行可能な解決策であるかどうかについてもコメントをいただければ幸いです。

前もって感謝します。

PS: わかりやすくするために、派手な C++ クラスを意図的に省略しました。救助へのブーストを提案しているすべての人々のために:管理上の理由により、私の現在のプロジェクトではオプションではありません。

4

4 に答える 4

1

の提案された実装は、アトミックな増加であるため、「同時」呼び出しで中間値を返すことはできないため、 ではsem_post_multipleうまく機能しません。sem_getvaluesem_post_multiplesem_getvalue

個人的には、それらの両方を省略したいと思います。それらのないシステムに基本的な同期操作を追加しようとするのはマグのゲームであり、ラッパーはすぐに「薄い」ものではなくなる可能性があります。sem_post_multipleしたがって、絶対に移植しなければならない を使用するコードを持っていない限り、それに立ち入らないでください。

于 2010-12-02T22:01:51.647 に答える
1

いずれにせよ、セマフォは POSIX のオプションの拡張機能です。たとえば、OS X はそれらを完全に実装していないようです。したがって、移植性に関心がある場合は、とにかく必要な機能のラッパーを提供する必要があります。

反復によってアトミックインクリメントをエミュレートするアプローチにsem_postは、確かに欠点があります。

  • 通常 sem_t、パフォーマンスが重要なコンテキストで使用される場合、パフォーマンスが低下している可能性があります。
  • この操作はアトミックではありません。そのため、ループを終了する前に混乱が生じる可能性があります。

私は、必要に応じて、厳密に POSIX に準拠することに固執します。sem_timedwaitこれは、セマフォ オプションのもう 1 つのオプション部分であることに注意してください。

于 2010-12-02T22:02:23.183 に答える
0

sem_post_multiple() は、win32-pthreads メンテナによって導入された非標準のヘルパー関数です。複数のデクリメントはアトミックではないため、実装は彼らのものと同じではありません。これが問題になるかどうかは、使用目的によって異なります。(個人的には、必要がない限り、または必要になるまで、この機能を実装しようとはしません。)

于 2010-12-02T22:01:09.703 に答える
0

これは興味深い質問です。+1。

その機能を実装するのはおそらく良い考えではないという現在の一般的なコンセンサスに同意します。提案された実装はおそらくほとんどの状況で問題なく機能しますが、原子性がないために結果が劇的に異なる可能性がある条件が確実に存在します。以下は、(非常に) 不自然な状況の 1 つです。

  • sem_post_multiple( s, 10 ) を呼び出すスレッド A を開始します。
  • s で待機していたスレッド B が解放されます。スレッド B はスレッド A を強制終了します。

上記の不親切なシナリオでは、アトミック バージョンはセマフォを 10 ずつインクリメントします。非アトミック バージョンでは、1 回だけインクリメントできます。この例は、現実の世界ではありそうにありません。たとえば、スレッドの強制終了は、セマフォ オブジェクトが無効な状態のままになる可能性があることは言うまでもなく、ほとんどの場合、悪い考えです。Win32 実装は、セマフォにミューテックス ロックを残す可能性があります。理由については、こちらを参照してください

于 2010-12-02T22:26:41.417 に答える