

お世話になっております。

ゲームで使用する為の  
std::threadを使ったジョブシステムが作れないと考えています。  
想定しているインタフェースとしては以下の通りです。

[code]

    // コア数を指定してその分std::threadを生成
    int threadNum = 8;
    JobManager.Create( threadNum );
    
    //実行時
    int num = 10000;
    // 実行(オブジェクト数、関数ポインタ、void*のデータ).
    JobManager.Start( num, pFunc, pData);
    // 待機.
    JobManager.Join();
    
[/code]

std::threadは、コンストラクタの時点で関数ポインタを渡さなければならず  
また、スレッド生成時にはかなりのコストがかかる為  
ゲームのように毎フレームStart()、Join()を実行するのは困難だと思います。

std::threadでジョブシステムを実装することは難しいのでしょうか？  
以上、よろしくお願いいたします。


CC BY-SA 3.0
2017-12-26T18:34:41.810
40548
2017-12-28T14:04:48.553
2017-12-28T14:04:48.553
49
26795
question
c++ c++11
C++11を使用したジョブシステムの実装方法について


スレッドの頻繁な生成/消滅によるコストが気になるのであれば、スレッドプールを作ってみてはいかがでしょうか?

あらかじめスレッドをいくつか作ってプールにためておき、必要な時にプールからスレッドを取り出して処理をさせるイメージです。スレッドは処理が終わったらプールに戻り、次の処理を待機します。

ゲームプログラム起動時に一回スレッドプールを作って、プログラム終了まで作り直さなければ、スレッド生成のコストは起動時のみでそれ以降は発生しません。

ざっと検索してみたところ、例えば以下のページが参考になるかもしれません:  
<https://cutlassfish.wordpress.com/2016/09/14/c-%E3%81%A7-worker-
thread-%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3/>


CC BY-SA 3.0
2017-12-27T15:37:29.513
40563
2017-12-27T15:37:29.513
5288
40548
answer


質問はC++11とのことですので条件を満たしませんが、C++17ですと[並列アルゴリズム](http://faithandbrave.hateblo.jp/entry/2016/09/27/155500)が導入されています。

[code]

    std::vector<Data> data;
    std::for_each(std::execution::par, begin(data), end(data), pFunc);
    
[/code]

とやると各`data`に対して`pFunc`が並列に実行されます。実装依存かとは思いますが、スレッドプールが使われるのではないかと予想しています。


CC BY-SA 3.0
2017-12-28T05:02:49.170
40577
2017-12-28T05:02:49.170
4236
40548
answer