2015-09-30 51 views
1
std::vector<std::thread> thread_pool; 
    ... 
    std::generate_n(std::back_inserter(thread_pool), cpu_cores, 
        [](){ 
     //... 
     return std::thread{worker(worker_name) }; 
    }); 

其中:std :: generate_n算法需要複製ctor。如何避免在下面的代碼中?

class worker { 
     std::atomic_bool done; 
    protected: 
     void operator()() { 
      while(!done) { 
// some work 
      } 
    } 
    public: 
    worker(const std::string& worker_name) 
     : done(false) { 
     // some initialization 
    } 
// other fields 
}; 


    error: use of deleted function 'std::atomic_bool::atomic_bool(const std::atomic_bool&)' 

GCC 4.9

,我看到原子不能被複制,剛搬來。上面的代碼需要爲some_object類複製ctor。 如何解決這個問題?

(可能是設計本身更糟糕的是, 這裏,some_object是一個線程函子,而原子是關閉的過程中下一個標誌)

+0

您可以創建一個'back_emplacer'(參見,例如,http://stackoverflow.com/questions/ 18728257/back-emplacer-implementation-default-operator-vs-universal-reference-version) – Andrew

+1

您能否提供[最小,完整和可驗證的示例](http://www.stackoverflow.com/help/mcve)?問題可能出現在你的「...」某處。 'some_object'是可移動的嗎? – Barry

+1

什麼編譯器?上述代碼的哪一行是在抱怨拷貝文件被調用?實際的錯誤信息是什麼?你爲什麼認爲「上面的代碼」需要「複製ctor」? – Yakk

回答

5

你的類:

class worker { 
    std::atomic_bool done; 
}; 

不因爲std::atomic明確delete是其複製構造函數(其隱含delete s它的移動構造函數)可複製或可移動。如果你想允許它被移動或複製,你必須編寫自己,如:

worker(worker&& rhs) 
: done(rhs.done.load()) 
{ } 
+0

謝謝。這正是我所尋找的 – amigo421

+0

而'worker'移動構造函數應該複製'done'的值並不明顯。 –