Передать объект класса, имеющий мьютекс, в boost::thread по ссылке

Я хотел бы запустить несколько экземпляров функции, которая выполняет некоторые вычисления. Функция принимает объект класса, и, поскольку класс включает shared_mutex, я передаю его по ссылке, чтобы все потоки обращались к классу через один и тот же объект.
Если я попытаюсь запустить функцию через boost::threads (даже через один), я получаю ошибку компиляции:

/usr/include/boost/thread/pthread/shared_mutex.hpp:173:9: error:
‘boost::shared_mutex::shared_mutex(boost::shared_mutex&)’ is private
     BOOST_THREAD_NO_COPYABLE(shared_mutex)
     ^
/cl_shared.h:12:7: error: within this context
class cl_shared {
      ^

Если я вызываю функцию напрямую через main, она работает нормально. Как запустить функцию несколько раз? Мьютекс предназначен для обеспечения безопасности потоков, поскольку в класс читается/записывается более одного потока. В разобранном виде выглядит так:

class cl_shared {
public:
    //constructor 
    cl_shared() { }; 

    //functions here using the mtx
    void hello() {
        cout<<"hello"<<endl;
    };

    boost::shared_mutex mtx;
    int aint;
};

cl_shared shared;

int main(int argc, char **argv) {
 // XMA::mov_avg(shared, arg1); //does work

 // boost::thread worker1(XMA::mov_avg, shared, arg1); //error: mutex is private
 // boost::thread worker2(XMA::mov_avg, shared, arg1); //like to start it simultaneously;
 //boost::thread worker1v2(XMA::mov_avg, boost::ref(shared), 0, avg_typ, pos_vel, w_leng, parse); //does compile, but is it ok?
}

Функция выглядит так:

//the function head:
void mov_avg(cl_shared &shared, int arg1){
 //do sth.
}

person qrtLs    schedule 29.02.2016    source источник
comment
boost.org/doc/html/thread/   -  person llonesmiz    schedule 29.02.2016
comment
Кстати, он говорит, что конструктор копирования mutex является закрытым.   -  person llonesmiz    schedule 29.02.2016
comment
stackoverflow.com/questions/22354972 /   -  person llonesmiz    schedule 29.02.2016


Ответы (1)


Поскольку мьютекс не копируется, любой объект, который содержит его как нестатический элемент, также не копируется. Вам нужно передать экземпляр вашего класса как любой указатель ссылки. Чтобы передать его по ссылке, используйте boost::ref (или, лучше, std::ref) и убедитесь, что ваша функция потока также принимает аргументы по ссылке.

person SergeyA    schedule 29.02.2016