いくつかの計算を実行する関数の複数のインスタンスを開始したいと思います。この関数はクラス オブジェクトを受け取り、クラスには が含まshared_mutex
れているため、すべてのスレッドが同じオブジェクトを介してクラスにアクセスするように参照渡しします。
boost::threads (1 つでも) を介して関数を開始しようとすると、コンパイル エラーが発生します。
/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.
}