通过引用将具有互斥量的 class 对象传递给 boost::thread
Pass class object having mutex to boost::thread by reference
我想启动执行某些计算的函数的多个实例。该函数采用 class 对象,并且由于 class 包含 shared_mutex
我通过引用传递它,因此所有线程都通过同一对象访问 class 。
如果我尝试通过 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 调用该函数,它工作正常。如何多次 运行 函数?互斥锁用于线程安全,因为 reads/writes 到 class 不止一个线程。分解看起来像:
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.
}
由于互斥锁是不可复制的,任何将它作为非静态成员持有的对象也是不可复制的。
您需要将 class 的实例作为任一引用指针传递。要通过引用传递它,请使用 boost::ref
(或者更好,std::ref
)并确保您的线程函数也通过引用接受它的参数。
我想启动执行某些计算的函数的多个实例。该函数采用 class 对象,并且由于 class 包含 shared_mutex
我通过引用传递它,因此所有线程都通过同一对象访问 class 。
如果我尝试通过 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 调用该函数,它工作正常。如何多次 运行 函数?互斥锁用于线程安全,因为 reads/writes 到 class 不止一个线程。分解看起来像:
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.
}
由于互斥锁是不可复制的,任何将它作为非静态成员持有的对象也是不可复制的。
您需要将 class 的实例作为任一引用指针传递。要通过引用传递它,请使用 boost::ref
(或者更好,std::ref
)并确保您的线程函数也通过引用接受它的参数。