処理する必要のある要素を含むキューがあります。これらの要素を並行して処理したいと思います。同期する必要がある各要素のいくつかのセクションになります。いつでも、スレッドを実行している最大num_threadsが存在する可能性があります。
私が達成したいことのアイデアをあなたに与えるためのテンプレートを提供します。
queue q
process_element(e)
{
lock()
some synchronized area
// a matrix access performed here so a spin lock would do
unlock()
...
unsynchronized area
...
if( condition )
{
new_element = generate_new_element()
q.push(new_element) // synchonized access to queue
}
}
process_queue()
{
while( elements in q ) // algorithm is finished condition
{
e = get_elem_from_queue(q) // synchronized access to queue
process_element(e)
}
}
使うことができます
- pthreads
- openmp
- インテルスレッドビルディングブロック
私が抱えている主な問題
- いつでも、最大num_threadsのスレッドを実行していることを確認してください
- キューで使用する軽量の同期方法
私の計画は、キューコンテナのInteltbbconcurrent_queueです。しかし、その後、pthread関数(ミューテックス、条件)を使用できますか?これが機能すると仮定しましょう(そうする必要があります)。次に、pthreadを使用して、ある時点で最大num_threadsを設定するにはどうすればよいですか?一度スレッドを作成し、1つの要素がプロセスになった後、キューにアクセスして次の要素を取得することを考えていました。ただし、キューに要素がない場合にアルゴリズムが終了するという保証がないため、より複雑な場合。
私の質問
実装を開始する前に、Intel tbbまたはpthreadを使用して必要な動作を取得する簡単な方法があるかどうかを知りたいですか?キューからの要素をより正確に並列処理する
注:タスクを使用しようとしましたが、成功しませんでした。