c++ - C++ 的线程安全 vector 类

标签 c++ multithreading thread-safety

有人知道用于 c++ 的快速而肮脏的线程安全 vector 类吗?我正在对一些代码进行多线程处理,我相信我遇到的问题与 vector 的使用方式有关。我计划重写代码,但在我疯狂地重做代码之前,我想用线程安全 vector 对其进行测试以确保。我还想如果有这样的东西,它会比编写我自己的版本容易得多。

最佳答案

由于算法,这很困难。

假设您包装了 vector 以便它的所有成员函数都使用互斥体进行序列化,就像 Java 同步方法一样。然后并发调用该 vector 上的 std::remove 仍然不安全,因为他们依赖于查看 vector 并根据他们看到的内容进行更改。

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

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

template <typename T>
class LockedVector {
    private:
    SomeKindOfLock lock;
    std::vector<T> vec;
};

然后将其作为替换容器放入,并开始实现成员函数(以及成员 typedef 和运算符),直到它编译为止。您会很快注意到,如果您的任何代码在 vector 上使用迭代器,而这种方式根本无法从内到外实现线程安全,并且如果需要,您可以在这些情况下临时更改调用代码以锁定 vector 通过公共(public)方法。

关于c++ - C++ 的线程安全 vector 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1099513/

相关文章:

c# - 如何从创建它的线程以外的线程读取组合框?

c++ - QT事件问题

C++ - 模板类、头文件和重复错误

c# - 如何检查线程是否完成执行

java - 如何选择线程池大小?

python - Python 中的线程与异步执行

python - ThreadPoolExecutor 线程数

c++ - 为什么 C++ 允许将指向基对象的指针转换为派生类的指针

c++ - 使用 interval_map 和封闭边界 boost 自定义间隔

c++ - 对象和多线程的多个实例的线程安全