Fra*_*ank 4 multithreading mutex boost-thread
关于Boost::Thread
和我有一个新手问题Mutex
.
我想启动以下的许多并行实例Worker
,并且所有这些实例都写相同std::vector
:
struct Worker {
std::vector<double>* vec;
Worker(std::vector<double>* v) : vec(v) {}
void operator() {
// do some long computation and then add results to *vec, e.g.
for(std::size_t i = 0; i < vec->size(); ++i) {
(*vec)[i] += some_value;
}
}
};
Run Code Online (Sandbox Code Playgroud)
我明白工人必须vec
在写入之前锁定并在完成时将其解锁(因为所有工人都写入相同的向量).但是我该怎么表达呢?
你需要一个boost :: mutex来保护向量,你可以使用boost :: mutex :: scoped_lock来锁定构造函数中的互斥锁,并在析构函数中解锁它
请记住,您需要在访问该实例的任何位置使用相同的互斥锁,无论vec
是读取还是写入.
为了让你前进,你可以做以下事情:
struct Worker {
boost::mutex &vec_mutex;
Worker(std::vector<double>* v,boost::mutex &v_mutex) : vec(v),vec_mutex(v_mutex) {}
void operator() {
// do some long computation and then add results to *vec, e.g.
boost::mutex::scoped_lock lock(vec_mutex);
for(std::size_t i = 0; i < vec->size(); ++i) {
(*vec)[i] += some_value;
}
}
};
Run Code Online (Sandbox Code Playgroud)
对于更高级的东西,你应该进一步封装vector和mutex,或者迟早你会忘记这些需要连接,你可以访问vec
某个地方而不需要锁定导致很难调试问题.对于这个例子的问题,我宁愿让工人使用他们自己的单独的向量,并在工人完成时将结果组合在一个控制线程中.
归档时间: |
|
查看次数: |
4267 次 |
最近记录: |