对于具有多线程的嵌套stl容器,什么是好的设计

时间:2013-05-05 03:10:59

标签: multithreading stl containers tbb

我很难弄清楚,作为更大项目的一部分,我可以为以下对象设计一个组织良好且高效的设计。

请注意,我有多个线程处理对象,一些读取,还有一些写入对象。

我有一个大的stl矢量对象让我们说Nodes。每个节点都有一些属性加上2个小的stl向量。 线程可以修改对象及其中的两个向量。

我知道stl向量不是线程安全的,我必须提供它,但我认为使用intel TBB比使用大向量的stl向量更容易。我尝试了这个,但我得到了分段错误,因为线程可能会修改节点内的两个较小的向量,因为它们可以存储在Node的空间之外,因此TBB的concurrent_vector不保护它们,即使它们是Node的属性。如果我错了,请纠正我。) 现在我正在考虑删除大的stl向量并将节点保持为堆中的空闲节点。至少这种方式我可以更好地提供同步。但我怀疑我能否像英特尔TBB一样快。我无论如何都不能使用intel TBB的向量,因为它不能保护节点内的小内部向量。 (出于某种原因,我必须将内部向量保持为stl向量)。

现在我的问题是“这是一个优秀而有效的设计吗?” 任何评论都表示赞赏。

Class All
{
 tbb::concurrent_vector<Node> MyArray;
}

Class Node
{
    void inline Check_Set_lock ();
    void inline Unset_lock ();

    std::vector<pair<int,int> > MBR;    
    std::vector<double> Measures;
    omp_lock_t xlock;
}

请注意我必须使用openmp锁加上两个锁定/解锁方法来保护Node对象。我也知道Boost线程,但是如果我应该选择Boost线程来提供分离的读写锁定,那么我又难了吗?我认为openmp不提供共享锁。

我的最后一个问题是,我是否只能在代码中使用xlock来保护每个Node中的所有属性和stl向量,当它被线程读取/写入时?我认为这会降低并行性,但是什么是更好的选择?

0 个答案:

没有答案