2017-10-15 16 views
0

私は現在、OOPで空港を設計するプロジェクトに取り組んでいます。私はC++を使用しています。私は飛行機が上陸できる滑走路の番号を割り当てるRequestLanding()関数を持っている私のプログラム内の主要なAirportオブジェクトを持っています。この関数は、2つの列挙型のうちの1つ、つまり、飛行機が着陸するかどうかを示すHoldまたはProceedを返します。Openmpスレッドスリープ

外部からは、着陸要求を行う飛行機のオブジェクトが多数あります。私は飛行機のオブジェクトの総数のためにループを使用しています。私は並列ループにOpenMpを使用しています。 RequestLanding()関数が状態ホールドを返してから再度試して、3秒間openmpスリープスレッドを作成したかったのです。

これを行う方法はありますか?誰かが簡単な例を提供できますか?前もって感謝します。

+0

スリープよりも「yield」ラフターを使用しないのはなぜですか? – user0042

+0

@ user0042あなたは 'std :: this_thread :: yield'を意味すると仮定します。 Linuxでは 'sched_yield'にマップされ、' sched_yield'は厳密なループで呼び出されるのには絶対に適さない方法で実装されます。 https://stackoverflow.com/q/6807929/620382も参照してください。 – Zulan

答えて

1

あなたは非常に悪いことをしようとしているようですね。

実際に何をしているのか分からない限り、スリープの有無にかかわらず、スレッド内で手動でポーリング(条件を繰り返し確認)するべきではありません。代わりに、状態変数のような適切な構成を使用して、準備状況を通知します。それを行うための特定の正しい方法は、特定のユースケースに依存します。

OpenMPでは、スレッドはループ反復などの複数の処理を行うワーカーです。あなたが処理するはずの他のもの(ループ反復、飛行機)を遅らせるので、それを不必要に遅らせる必要はありません。

OpenMPでは、飛行機のオブジェクトを処理するためにタスクが若干適しています。しかし、タスクは依存関係を持つことができますが、兄弟タスクやループ反復の間にしか存在しません。 OpenMPのタスクではtaskyieldにすることもできますが、私はどのような前提も慎重に考えています。あなたは、各飛行機のためのスレッドを持っているし、状態をチェックするタイトなループでstd::this_thread::yieldので、sched_yieldを呼ぶとしましょう:物事がして恐ろしく間違って行くことができる方法の例として

。ブロックされている飛行機が他の飛行機にCPUを使用させると考えられます。あなたは間違っているでしょう。現在のLinuxスケジューラは、ブロックされた飛行機に実際の作業をしたいのと同じCPU時間を与えます。私はomp taskyieldがより良い方法で実装されることを願っていますが、私はそれを期待しません。

同時に、任意の形式のsleepを呼び出すと、人為的な遅延が発生します。