2016-11-24 46 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'。 –