2009-12-01 9 views
7

私は以下のようなシナリオを持っています: の整数のペア(本質的にはタスクの説明)を持つ1つのスレッドがあります。 このコンテナから要素を取り、何らかの作業を実行するワーカースレッド(8-16)の数。C++でマルチスレッドワークキュー(コンシューマ/プロデューサ)を構築する

ブロックキューで問題を簡単に解決できると考えました。アイテムを削除すると、スレッドはキューへのアクセスを同期し、利用可能なデータがない場合はスリープします。

私は(おそらく間違って)このようなものがSTLまたはブーストに存在するはずだと仮定しましたが、何も見つかりませんでした。

私は実際に自分でそれを実装する必要がありますか?このような一般的なシナリオのようです...

答えて

2

Windowsの場合、VS2010のエージェントライブラリを参照してください。これはコアシナリオです。あなたが/からデータを取得するために...またはあなたが一緒にバッファをリンクして、ブロックセマンティックプロデューサーを変換することができ、スレッド、「薬」または「タスク」を使用することができます

//an unbounded_buffer is like a queue 
unbounded_buffer<int> buf; 

//you can send messages into it with send or asend 
send(buf,1); 

//receive will block and wait for data 
int result = receive(buf) 

すなわち

http://msdn.microsoft.com/en-us/library/dd492627(VS.100).aspx

消費者の問題をデータフローネットワークに伝える。

4

自分で実装する場合、実装はセマフォ、mutex、およびキューオブジェクトのかなり単純な組み合わせでなければなりません。ここで

は、いくつかの擬似コードです:あなたがOSX Snow Leopardの上にいる場合は

Produce{ 
    pthread_mutex_lock(&mutex); 
    queue.push_back(someObjectReference); 
    pthread_mutex_unlock(&mutex); 
    sem_post(&availabilitySem); 
} 

Consume{ 
    sem_wait(&availabilitySem); 
    pthread_mutex_lock(&mutex); 
    queue.pop_front(someObjectReference); 
    pthread_mutext_unlock(&mutex); 
} 
+0

セマフォの実装に応じて、Consumeプロセスはループ内で実行する必要があるかもしれません – Aaron

1

Windows上で実行するスレッドの管理方法に関して効率的なキューが必要な場合は、IO Completion Ports(hereを参照)を参照してください。私のfree server frameworkには、IOCPに基づいたタスクキューの実装が含まれています。おそらくそれはあまりにもあなたが欲しいものに特化している。

関連する問題