Anthony Williamsの本の中の単純なスレッドプールの例を使用しようとしています"C++ Concurrency in Action"。私はここにコード(クラスthread_pool)を見つけました: Synchronizing tasks 私は別の質問があります。私は、次のシグネチャを持つキューにタスク(メンバ関数)を提出したいと思います:C++ 11スレッドプール - 入力パラメータを持つタスク
class A;
class B;
bool MyClass::Func(A*, B*);
私はthread_poolクラスを変更する必要があります、またはどのように私は、いくつかの空に私の機能をパックするにはどうすればよいですF()、この例ではタスクとして使用されていますか?ここ は(詳細は上記のリンクを参照してください)私のクラスの最も関連する部分である:
class thread_pool
{
thread_safe_queue<std::function<void()> work_queue; // bool MyClass::Func(a,b) ??
void worker_thread() {
while(!done) {
std::function<void()> task;
if(work_queue.try_pop(task)) {
task(); // how should my function MyClass::Func(a,b) be called here?
}
else {
std::this_thread::yield();
}
}
}
// -- Submit a task to the thread pool
template <typename FunctionType>
void submit(FunctionType f) {
work_queue.push(std::function<void()>(f)); // how should bool MyClassFunc(A*, B*) be submitted here
}
}
そして最後に、どのように私は自分のコード内の関数を提出呼び出すことができますか?
ありがとうございます(unfortunatelly私はまだC++ 11のすべての機能を使用していますが、これはおそらく私がここで助けを必要としている理由ではありませんが、この質問に対する答えは何か:)と)。
バインダーを使用しているときに、参照の上にどのような制御があるのでしょうか...バインダーは常に元のタイプのコピーを保存していますか? )?その場合、重複のパフォーマンスがわずかに低下しますが、これは素晴らしい解決策です。 –
@WernerErasmus 'std :: bind'とラムダキャプチャは引数をコピーします。参照を格納する場合は、 '[&a、&b](){}'を参照するか、 'std :: bind(f、std :: ref(a)、std :: ref(b)) 'を返します。 – Jens
コピーは安全なオプションですが、これは時期尚早の最適化であるかもしれませんが、バインドを使用しない場合もあります(私が行ったように)。つまり、このタイプのコードは「一般的に」使用されるため、予期せぬ(大きな引数など)ために最適化が必要になる可能性があります。 –