1

CPU を集中的に使用するジョブを複数のスレッドに分割したいと考えています。たとえば、4 つのスレッドでスレッド プールを作成したいと考えています。

以下を行うための非常に迅速な方法を知りたいです。

  1. 受信処理用に 1 つのスレッドが空いているかどうかを確認する
  2. 特定の関数を開始するように 1 つのスレッドにシグナルを送る
  3. すべてのスレッドがジョブを完了するのを待ちます

これは可能な限り高速にする必要があります。Windows 7 の Visual Studio 2010 で C++ を使用しています。ポータブル アプローチよりも高速な場合は、Win7/VS2010 固有のソリューションが優先されます。

編集: MSDN でこのサンプルを見つけました:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686946(v=vs.85).aspx

これを行うより速い方法はありますか?

4

4 に答える 4

1

tbbを試してください

class SimpleTask: public tbb::task {

public:
    SimpleTask(const char *c ) {}
    task* execute() {
        //do task
        return 0;
    }
};
//execute tasks and wait
    tbb::task_scheduler_init init(50);//initialize pool
        tbb::task_list list;

        for(int i=0;i<30;i++){//create 30 task

            list.push_back(*new(tbb::task::allocate_root()) SimpleTask());
        }

tbb::task::spawn_root_and_wait(list);//execute and wait for all task or call spawn without wait
于 2012-08-20T07:13:16.673 に答える
1

Boost スレッド ライブラリのものはかなり高速です。boost::condition_variable を待機する 4 つのスレッドを開始できます。メイン スレッドでは、タスク キューに何かを追加してから、boost::condition_variable::notify_one を呼び出して、空いているスレッドがあればそれを開始できます。作業中のスレッドの 1 つが通知されるとすぐに、タスク キューから内容を取り出し、キューが空になるまでそれを続けます。タスク キューが終了するのを待つために、タスク キューを空にするスレッドが boost::condition_variable::notify_all を呼び出し、そのシグナルをメイン スレッドで待機させます。明らかに、このようなものの共有データをミューテックスで保護する必要があります。

この手法は、中規模から大規模なサイズのタスクがあり、1 秒間に数千以下のタスクを実行する必要がある場合にうまく機能します。この手法を使用した小さなタスクの経験はありません。

並列パターン ライブラリ (PPL) もその点で非常に優れており、多くのことを実行してくれますが、それほど制御することはできません。Windowsのみですが、それで問題ないようです。;)


編集:あなたのリンクは良い解決策のようです。通常、他の API は WINAPI に基づいて構築されているため、WINAPI を使用するのが最速です。ただし、WINAPI はあまり優れた抽象化を提供しません。したがって、PPL、先物などでそのようなタスクを実行することをお勧めします。あなたの仕事はどれくらい大きいですか?数ミリ秒以上かかる場合は、ボトルネックではないため、使用している API について心配する必要はありません。

于 2012-08-20T06:35:30.903 に答える
1

最初の方法:非同期プロシージャ コール

別の方法:タスクに使用できるI/O Completion Ports 。

于 2012-08-20T06:28:59.410 に答える
1

Visual C++ 固有のスレッド プールについては知りませんが、いくつかの .xml の存在については聞いたことがありppl.hます。boost threadpool私が使用した非公式のものがあります。他のすべてのブーストと同じように、Visual Studioでうまくコンパイルされます

于 2012-08-20T06:31:32.040 に答える