2017-11-30 9 views
0

いくつかのスレッドをパッシブな待機モードにし、障壁に到着するとそれらを起動させる方法を見つけようとしています。私は到着すべき固定量のスレッドを持っています。Cでスレッドの受動待ちFIFOを作成するには?

私は最初に0で初期化するセマフォを考えていたので、ブロックされますがランダムに解放されます。私はFIFOのような同期の障壁に来た順にスレッドを解放するシステムを実装したいと思います。

私はまた、2つのセマフォを使用することについて考えました。ブロックするとスレッドを解放してソートします。スレッドが良いものであれば、それだけになります。そうでなければ、2番目のセマフォでブロックされます。しかし、このシステムは長くて厄介なようです。

私に役立つアイデアや提案がありますか?

はどうもありがとうございました:)

+0

「私は好きです」 - それは確固たる要件ですか?もしそうでなければ、それは避けがたい厄介です。一般に、あなたが提案するような注文を強制するのは、避けるのが最善のデザインです。これは可能ですが、障壁から解放されたスレッドXは、直後に解放されるスレッドX + 1が先取りされる可能性があるため、あなたの 'like'は実際には実行可能ではありません。 –

+0

私は、保証と無視できる利点を提供するたくさんの余分なシステムコールを本当に作成する必要がある場合は、それらをすべてCSに入れ、最後にセマフォを取得し、セマフォを待ち行列コンテナに入れ、CSを終了し、 semaをブロックする。最後のスレッドが入ると、.itはセマフォをデキューし、それらを順番に通知し、CS自体を終了して実行します。 –

+0

Re、 "スレッドをパッシブな待機モードにして、障壁に到着すると目を覚ます"それは意味をなさない。受動的に何かを待っている限り、スレッドは決して「障壁に到達する」ことはありません。通常、「バリア」と言えば、「バリアに到達する」というのは、スレッドが待機する原因となる状況です。 –

答えて

0

をLinux上で、あなただけの同じFIFO順にスレッドをブロックし、ブロック解除する条件変数とミューテックスを使用することができます。

これは、条件変数上のすべてのウェイターがカーネルのfutex待ち行列に順番に追加されるためです。ウェイターの起床は、同じFIFO順で行われます。ミューテックスをロックしたままにしておけば、条件変数に信号を送ることができます。

ただし、コメント欄に記載されているように、これはスレッドの実行順序に依存することをお勧めしません。

+0

ありがとう。私はそれが効率的ではないことに同意する。それは実際に私が持っている課題です。各スレッドは、待機中の部屋のクライアントを表すはずです。したがって、待機中にCPUリソースを使用してはいけません。各クライアントは、到着した順にリリースされなければなりません。 – MaxUt

関連する問題