2016-11-24 3 views
0

Я использую boost::thread для вызова функции-члена класса из другой функции-члена того же класса. Объявление метода я хотел бы нить:boost :: thread in-class Member function call возвращает уникальная ошибка создания экземпляра

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

И я создаю темы из другой функции члена с помощью:

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

Это единственные призывы к boost функций в коде I» м используя.

Я видел в других вопросах, что этот синтаксис будет работать для нестатических функций-членов (и нет проблем с доступом с тем, как я создал потоки). Однако при компиляции я получаю следующую ошибку:

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

Я понял ответ, удалив все ссылки на boost для #include заявления, за исключением. В моем заголовочном файле я использовал

#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

Жаль, что слышу это. В этом случае вам может потребоваться вручную установить препроцессор define для отключения поддержки ссылки rvalue в Boost для вашего кода, поскольку Boost будет иметь другое представление о том, что должно делать rvalue, чем ваш компилятор. – 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() '. Я передаю «это» по уважительной причине. –

Смежные вопросы