私はtask
のクラスを持っています。私はtask_storage
親クラスに含まれる約10-15のタスクを持っています。 task::execute()
内部Iがゼロに到達するためにアトミック変数を待つ必要があります。std :: mutexとstd :: condition_variable構築オーバーヘッドとヒープ割り当て
void task::execute()
{
for_subtasks([this]
{
thread_pool.post([this]
{
this->do_work();
// Atomic counter.
--(this->_remaining_subtasks);
});
});
// wait for `_remaining_subtasks == 0`
}
私は可動task
を維持しながら_remaining_subtasks == 0
を待つために3つの選択肢を考えています
while(...){ sleep(1); }
ビジーウェイトループを使用してください。std::mutex
とstd::condition_variable
を組み込んで使用してください。void task::execute() { std::mutex m; std::condition_variable cv; for_subtasks(/* ... */); std::unique_lock<std::mutex> l(m); cv.wait(l, [this]{ return this->_remaining_subtasks == 0; }); }
- ストア
std::unique_ptr<std::mutex>
やフィールドなど
task
内部std::unique_ptr<std::condition_variable>
。これにより、task
は移動可能になりますが、同期プリミティブにアクセスするための間接参照も導入されます。void task::execute() { for_subtasks(/* ... */); std::unique_lock<std::mutex> l(*this->_m); this->_cv.wait(l, [this]{ return this->_remaining_subtasks == 0; }); }
私はビジーウェイトを使用する予定はありません。私は2と3の間で最速のソリューションをプロファイリングしようとしましたが、意味のある結果は得られませんでした。
std::mutex
とstd::condition_variable
の建設費は重要ですか?また、ヒープの割り当てやアクセスが遅くなるのでしょうか?