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实例化错误的主要内容,如果未能解决你的问题,请参考以下文章

从 boost::threaded 成员函数中获取返回值?

boost::thread & 成员函数

Boost Thread int 参数到成员函数不起作用?

测试页面

boost - thread.join() 停止用户界面

C++中,类内的成员变量自动初始化为零吗,而全局变量随意赋值