boost::thread类内成员函数调用返回unique_lock实例化错误
Posted
技术标签:
【中文标题】boost::thread类内成员函数调用返回unique_lock实例化错误【英文标题】:boost::thread in-class member function call returns unique_lock instantiation error 【发布时间】:2016-11-24 04:36:54 【问题描述】:我正在使用boost::thread
从同一类的不同成员函数中调用类内成员函数。我想线程化的方法的声明是:
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
发生了什么事?显然我做错了什么,或者更糟糕的是,我的编译器设置有问题。
【问题讨论】:
由于 boost::unique_lock,您遇到了错误。不是因为你这里提到的代码。 @Sumeet 是的,但为什么我会在没有任何明确调用或包含 unique_lock 的情况下得到它? 【参考方案1】:我通过删除除#include
语句之外的所有对boost
的引用找到了答案。在我的头文件中,我正在使用
#include "boost/thread.hpp"
这有效,但不正确。一旦我将其更改为
#include "boost/thread/thread.hpp"
一切都毫无怨言地编译。
我正在使用版本 1.41.0
的 boost。
【讨论】:
您可能想在一段时间内更新您的 Boost 版本。 1.41 已经很老了。特别是,它早于右值引用的标准化,这就是为什么它的实现不适用于符合 C++11 的移动语义。 @ComicSansMS 感谢您的提醒。不幸的是,我无法控制我工作的计算集群上的 Boost 分布。我在 ROOT 6 接受的任何东西上进行操作(这并不多!) 很抱歉听到这个消息。在这种情况下,您可能需要手动设置预处理器定义以在 Boost 中为您的代码禁用右值引用支持,因为 Boost 对右值应该做什么的想法与您的编译器不同。 @ComicSansMS 是有道理的,但是这样做会显着降低我的代码速度吗?过渡到纯 pthread 是否更有意义? 对我有帮助:)【参考方案2】:创建线程对象时需要使用boost::bind
函数。例如:
double rand = 0;
std::vector<int> myVector;
ClassName obj;
auto threadObj = new boost::thread(boost::bind(&ClassName::nnMetropolisStep,&obj,rand,myVector));
【讨论】:
(1) 不,boost::bind
在我使用的构造中隐式使用 (2) 我在类的非静态成员函数中使用它。这意味着我不能声明ClassName
并将其传递给thread()
。我有充分的理由通过this
。以上是关于boost::thread类内成员函数调用返回unique_lock实例化错误的主要内容,如果未能解决你的问题,请参考以下文章