2010-09-17 76 views
4

我有一个关于Boost::ThreadMutex的新手问题。如何使用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; 
    } 
    } 
}; 

据我所知,劳动者有锁定vec之前写它和解锁它完成后(因为所有工作人员都写入同一个向量)。但我怎么表达呢?

回答

8

你需要一个boost ::互斥体,以保护载体,并且可以使用一个boost ::互斥:: 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; 
    } 
    } 

}; 

对于更高级的东西,你应该进一步封装载体和互斥,或迟早你会忘记,这些被连接的需求并且您将在某个地方访问vec而不锁定导致很难调试问题的锁。对于这个例子中的问题,我宁愿让工作人员使用自己的独立向量,并在工作完成后将结果合并到控制线程中。

+0

您是不是指'vec_mutex'而不是'io_mutex'? – Frank 2010-09-18 15:18:22

+0

是的,现在修好了。 – nos 2010-09-18 15:41:58

0

OT但有用的信息我希望 - 因为你正在更新这个向量很多(或只是为了最佳实践)考虑iterators遍历向量元素。通过不要求使用vector<double>::operator[]来加快工作者代码速度将减少工作线程的总计等待时间。

for(std::vector<double>::iterator iter = vec->begin(); iter != vec->end(); ++iter) { 
    *iter += some_value; 
} 
+0

你确定这个更快吗? Ay证明链接? – 2011-10-26 17:03:22

+1

迭代器减少到指针增量。该索引需要重复指针解引用(通过局部变量'vec'到达矢量),然后乘法来解析'operator []'。一个好的优化编译器可能能够将它们折叠成相同的东西,但为什么要抓住这个机会呢?建议您对两者进行编码并比较在特定编译器上生成的汇编代码。 – 2011-10-26 21:08:05