0

4 つのスレッドのスコープがあるプログラムを作成しています。VC++ 6.0を使用していますが、VC++ のみのライブラリは使用したくありません。(原則として) 最適なスレッド数は、コア数に基づいて決定する必要があります。

異なる数のコアに基づいて異なる数のスレッドを作成するコードを作成する方法???

次の表に従いたい

Cores | Threads
---------------
   1  |  2 
   2  |  3
   3+ |  4

1 つの GUI と 3 つのワーカー スレッドがあります。すべてのワーカー スレッドは、循環バッファーを使用します。以下のように3つのワーカースレッドを実装しようと考えています。

  1. ファイルから読み込みます 2. ファイルを処理します 3. 処理後に新しいファイルを作成します。

これら 3 つの手順はすべて、単一の入力ファイルごとに順番に実行されます。

処理するファイルの数が多い (1000 以上)

コアを検出する方法を知っています。if then else way もありえます。しかし、「if then else」に従ってコードを管理するのは難しい作業になりそうです。

この状況でコードを管理する標準的な方法はありますか?

4

3 に答える 3

3

std ::hardware_concurrencyを使用できます:

#include <iostream>
#include <thread>

int main() {

  std::cout << "Number of available cores on this system (hint): " 
            << std::thread::hardware_concurrency() << "\n";

}

次に、適切な数のstd::threadsを起動します。

于 2013-01-20T13:12:21.083 に答える
1

とりあえず、GUI スレッドは無視しましょう。常に同じになるからです。

ワーカー スレッドの場合、基本的にコアと同じ数 (最大 3 つ) のスレッドを作成するため、次のようなものが必要です。

HANDLE worker_threads[3];
int num_threads = min(num_cores, 3);

for (int i=0; i<num_threads; i++)
    worker_threads[i] = CreateThread(...);

さて、これらのスレッドの使用方法については、質問で説明したように、私はそれをしないというのが簡単な答えです。順番に実行する必要がある 3 つのステップを実行し、それらを複数のスレッドに分割することはほとんど意味がありません。実際、スレッドを特定のタイプのタスク専用にすることはまったく避けたいと思います。

代わりに、各スレッドが 3 つのタスクのいずれかを実行できるように、スレッドを汎用のままにします。実行するタスクのキューを使用します。スレッドは単にタスクをキューから取得して実行します。そのタスクの結果、別のタスクが実行される場合、そのタスクは残りのタスクと共にキューに戻されます。

これを C++ で行っているため、これを実装する明白な方法の 1 つは、すべてのタスクの基本クラスを作成することです。

class Task {
public:
    virtual int operator()() = 0;
};

そして、そこから 3 つの異なるタスク タイプを派生させます。次に、ポインターを扱っているという事実を隠して、コードを単純かつ単純にする小さなラッパー クラスを作成することをお勧めします。

于 2013-01-20T18:06:54.427 に答える
0

質問はあまり具体的ではないので、何が必要かを推測するのは難しいです。

一般にworkers、特定のジョブを実行し、結果について(コールバックまたはその他の方法で)通知するものを作成できます。

workerその後、何かをする必要があるたびに、新しいものを開始します。workersコアの数によっては、最大数になる可能性があります。どういうわけか、実行したいタスクをキューに保存して、次の空きに渡すことができる可能性がありますworker

何とかしてやりたいことを(おそらく簡単な例として)説明できれば、より良い手助けができるかもしれません。おそらく、ワーカーデザインを目的に合わせる方法を示すことができます。

于 2013-01-20T13:12:51.440 に答える