7

私には次のシナリオがあります:整数のペア(本質的にはタスクの説明)でコンテナーを埋めることになっている単一のスレッドがあり、これから要素を取得する必要がある多数のワーカースレッド(8〜16)がありますコンテナといくつかの作業を実行します。

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

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

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

4

6 に答える 6

4

自分で実装する場合、実装はセマフォ、ミューテックス、およびキューオブジェクトのかなり単純な組み合わせである必要があります。

ここにいくつかの擬似コードがあります:

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);
}
于 2009-12-02T17:53:15.497 に答える
2

Windows を使用している場合は、VS2010 のエージェント ライブラリを参照してください。これはコア シナリオです。

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

すなわち

//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)

スレッド、「エージェント」、または「タスク」を使用してデータを取得できます...または、バッファーをリンクして、ブロッキングセマンティックプロデューサー/コンシューマーの問題をデータフローネットワークに変換できます。

于 2009-12-02T03:46:39.967 に答える
1

Windowsを使用していて、そこからアイテムを処理するために実行できるスレッドを管理する方法に関して効率的なキューが必要な場合は、IO完了ポートを確認してください(ここを参照)。私の無料のサーバーフレームワークには、IOCPに基づくタスクキューの実装が含まれています。これは、このルートをたどる場合にも役立つ可能性があります。それはおそらくあなたが望むものにはあまりにも専門的ですが。

于 2009-12-02T18:03:38.507 に答える
0

私はあなたが望むものmessage_queueからだと思いboost::interprocessます。2 番目のリンクには使用例があります。

于 2009-12-01T13:43:20.667 に答える
0

ACE (Adaptive Communication Environment)と ACE_Message_Queue を調べてください。ブーストのmessage_queueは常にありますが、ACE は高いパフォーマンスの同時実行性という点で優れています。

于 2009-12-01T13:47:38.377 に答える
0

OSX Snow Leopard を使用している場合は、Grand Central Dispatchを参照してください。

于 2009-12-02T17:55:53.740 に答える