2016-11-24 44 views
0

我正在使用boost::thread從同一類的不同成員函數內調用類內成員函數。我想線程方法的聲明是:boost ::線程類內成員函數調用返回unique_lock實例化錯誤

void ClassName::nnMetropolisStep(double random, std::vector<int> nums); 

而且我通過創建從另一個成員函數線程:

boost::thread* tThread = new boost::thread(&ClassName::nnMetropolisStep, 
              this, 
              someRandom,someNums); 

這些都是在代碼中我唯一的調用boost功能使用。

我在其他問題中看到這種語法將適用於非靜態成員函數(並且我沒有構建線程的方式沒有訪問問題)。但是,當我編譯時,出現以下錯誤:

g++ -fPIC -std=c++11 -c -g -Wall `root-config --cflags --glibs` -MMD -c -o obj/IsingModel.o src/IsingModel.cpp 
In file included from /usr/include/boost/thread/pthread/mutex.hpp:11:0, 
      from /usr/include/boost/thread/mutex.hpp:16, 
      from /usr/include/boost/thread/pthread/thread_data.hpp:12, 
      from /usr/include/boost/thread/thread.hpp:17, 
      from /usr/include/boost/thread.hpp:13, 
      from src/interface/IsingModel.h:11, 
      from src/IsingModel.cpp:11: 
/usr/include/boost/thread/locks.hpp: In instantiation of 'boost::unique_lock<Mutex>& boost::unique_lock<Mutex>::operator=(boost::unique_lock<Mutex>&&) [with Mutex = boost::mutex]': 
/usr/include/boost/thread/future.hpp:414:33: required from here 
/usr/include/boost/thread/locks.hpp:269:22: error: cannot bind 'boost::unique_lock<boost::mutex>' lvalue to 'boost::unique_lock<boost::mutex>&&' 
     swap(temp); 
       ^
/usr/include/boost/thread/locks.hpp:279:14: note: initializing argument 1 of 'void boost::unique_lock<Mutex>::swap(boost::unique_lock<Mutex>&&) [with Mutex = boost::mutex]' 
     void swap(unique_lock&& other) 
     ^
make: *** [obj/IsingModel.o] Error 1 

這是怎麼回事?很明顯,我要麼做的不正確,或者更糟糕的是,我的編譯器設置存在問題。

+0

由於boost :: unique_lock,您正在收到錯誤。不是由於你在這裏提到的代碼。 – Sumeet

+0

@Sumeet是的,但爲什麼我會沒有任何明確的電話或包括unique_lock嗎? –

回答

0

我通過去除除了#include語句boost所有引用想出答案。在我的頭文件中,我使用的是

#include "boost/thread.hpp" 

哪些工作,但是不正確。一旦我將其更改爲

#include "boost/thread/thread.hpp" 

編譯時沒有任何投訴。

我使用的版本爲1.41.0

+0

您可能需要更新您的Boost版本。 1.41已經過時了。特別是,它早於rvalue引用的標準化,這就是爲什麼它的實現不符合C++ 11標準的移動語義。 – ComicSansMS

+0

@ComicSansMS感謝您的支持。不幸的是,我無法控制我工作的計算集羣上的Boost分佈。我操作任何ROOT 6將接受(這不是很多!) –

+1

對不起,聽到這一點。在這種情況下,您可能需要手動設置預處理器定義來禁用Boost代碼中的右值引用支持,因爲Boost對於右值應該比編譯器有什麼不同。 – ComicSansMS

-2

在線程對象創建期間,您需要使用boost::bind函數。例如:

double rand = 0; 
    std::vector<int> myVector; 
    ClassName obj; 
    auto threadObj = new  boost::thread(boost::bind(&ClassName::nnMetropolisStep,&obj,rand,myVector)); 
+0

(1)不,在我使用的構造中隱含地使用'boost :: bind'(2)我在一個類的非靜態成員函數中使用了這個。這意味着我不能聲明'ClassName'並將它傳遞給'thread()'。我很有道理地通過'this'。 –