2016-04-19 28 views
0

私は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つの選択肢を考えています

  1. while(...){ sleep(1); }ビジーウェイトループを使用してください。

  2. std::mutexstd::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; }); 
    } 
    
  3. ストア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::mutexstd::condition_variableの建設費は重要ですか?また、ヒープの割り当てやアクセスが遅くなるのでしょうか?

答えて

1

std :: mutexとstd :: condition_variableの構築オーバーヘッドは重要ですか?または、ヒープ割り当て/アクセスが遅くなるかどうか

どちらの場合も、コンストラクタを呼び出す必要があります。違いは、メモリが割り当てられている場所(静的記憶域、スタックまたはヒープ)です。ヒープ割り当ては最も遅いです。

LinuxおよびPOSIX互換システムでは、std::mutexおよびstd::condition_variableは、POSIX pthread_mutex_tおよびpthread_cond_t構造よりも薄いラッパーです。これらの構造を初期化するには、基本型のメンバ変数を設定し、呼び出しを行いません。言い換えれば、建設は安いです。

関連する問題