1

私は並列プログラミングについてはまったく新しいです。現在、問題があり、TBB で解決しようとしています。

問題を単純化するために、複数の人 (タスク) がボールを拾い、ボールの数字のハッシュ値に従ってコンテナー (concurrent_vector) に入れると想像できます。ロスレスであることを確認する必要があるためです。ボールはリンク リストとして表されます (これが、concurrent_hashmap の代わりに concurrent_vector を使用する理由です。ランダム アクセスが必要です)。コンテナがほぼ満杯の場合(判定には閾値と条件があります)。1人で今の容器から大きな容器に玉を全部入れていきます。正確を期すために、彼が他の容器にボールを移動するとき、他のすべての人はそれ以上ボールを追加するのをやめて、彼が終わるまで待つべきです. ボールを動かすには時間がかかるため、他のすべての人が現在のタスクを停止して、ボールを動かすのを手伝う方がよいでしょう。より効率的に設計するにはどうすればよいですか?mutex、spin_mutex、または条件変数を使用する必要がありますか? 現在、concurrent_vector を使用しているため、コンテナーの内容の変更は並行して行われます。移動手順のためにベクトル全体をロックする必要がありますか? また、TBB ミューテックスについて質問があります。再入場禁止ってどういうこと?

4

1 に答える 1

1

再入可能とは、関数 foo が実行中に、たとえばシグナルによって中断される可能性があることを意味します。その後、最初の呼び出しが完了する前に、シグナル ハンドラーで foo を再度呼び出すことができます。

関数を開始する前にミューテックスをロックする呼び出しを想像してください。この呼び出しは再入可能ではありません。もう一度呼び出そうとすると、mutex を取得しようとして永久にブロックされるからです。ただし、2 つのパラメーター x と y の合計を返すような関数は、x と y の両方がスタックに保存され、各呼び出しが独自のスタック ストレージを持っている場合、再入可能になる可能性があります。

reentrant とthread-safeを比較してください。スレッドセーフな関数は、2 つの呼び出しが同時に発生した場合 (ロックやアトミック操作の使用など) に問題がないように注意します。再入可能関数は、最初の呼び出しが中断された場合でも、自分自身を再度呼び出すことができることを保証します。再入可能関数は必ずしもスレッドセーフではないことに注意してください

于 2011-10-04T01:10:09.067 に答える