用于C++的Threadsafe Vector类

ras*_*124 14 c++ multithreading thread-safety

有谁知道c ++的快速和脏线程安全矢量类?我正在多线程处理一些代码,我相信我遇到的问题与使用向量的方式有关.我打算重写代码,但在我疯狂重做代码之前,我想用线程安全向量来测试它.我还想知道如果有这样的东西,它会比写我自己的版本容易得多.

Ste*_*sop 8

由于算法,这很难.

假设您包装了vector,以便使用互斥锁序列化其所有成员函数,例如Java同步方法.然后std::remove对该向量的并发调用仍然不安全,因为它们依赖于查看向量并根据它们看到的内容进行更改.

所以你的LockingVector需要专门化标准算法中的每个模板,以锁定整个事物.但是其他算法就像std::remove_if在锁定下调用用户定义的代码一样.一旦有人开始创建对象的向量,这些对象本身内部会锁定所有方法,那么在幕后默默地执行此操作是一种锁定反转的方法.

回答你的实际问题:抱歉,不,我不知道.为了快速测试您需要的那种,我建议您从以下开始:

template <typename T>
class LockedVector {
    private:
    SomeKindOfLock lock;
    std::vector<T> vec;
};
Run Code Online (Sandbox Code Playgroud)

然后将其作为替换容器放入,并开始实现成员函数(以及成员typedef和运算符),直到它编译为止.如果你的代码中的任何一个代码在向量上使用迭代器的方式很简单,那么你很快就会注意到它是从内到外不能保证线程安全的,如果需要你可以在这些情况下临时更改调用代码来锁定矢量通过公共方法.


Tod*_*ner 6

您可以查看TBB(如concurrent_vector).我从来没有使用它,老实说,我发现将范围保护对象放在访问更容易(特别是如果向量被正确封装).