STL向量和线程安全

2024-03-15

假设我有一个包含 N 个元素的向量,但该向量中最多有 n 个元素具有有意义的数据。一个更新线程更新第 n 个或第 n+1 个元素(然后设置 n = n+1),还检查 n 是否太接近 N,并在必要时调用 vector::resize(N+M)。更新后,线程调用多个子线程最多读取第n条数据并进行一些计算。

确保子线程永远不会更改或删除数据(事实上,任何数据都不会被删除),并且更新程序在完成更新后立即调用子线程。

到目前为止还没有出现问题,但是我想问一下,如果上次更新留下了一些子工作线程,在将向量重新分配到更大的内存块时是否会出现问题。
或者在这种多线程情况下使用向量是否安全,因为它不是线程安全的?

编辑: 由于当更新程序调用 vector::resize(N+M,0) 时仅发生插入,因此我的问题有任何可能的解决方案吗?由于STL向量的出色性能,我不愿意将其替换为可锁定向量,或者在这种情况下是否有任何高性能、已知且无锁的向量?


我想问一下,如果上次更新留下了一些子工作线程,在将向量重新分配到更大的内存块时是否会出现问题。

是的,这会非常糟糕。

如果您从多个线程使用容器,并且至少一个线程可能执行某些可能修改容器状态的操作,则必须同步对容器的访问。

如果是std::vector,任何改变其大小的东西(特别是插入和擦除)都会改变其状态,即使不需要重新分配(任何插入或擦除都需要std::vector的内部大小簿记数据有待更新)。


解决您的问题的一种方法是让生产者动态分配std::vector并使用std::shared_ptr<std::vector<T> >拥有它并给予它std::shared_ptr给每一个消费者。

当生产者需要添加更多数据时,它可以动态分配新的std::vector具有新的、更大的尺寸和旧元素的副本std::vector。然后,当您分拆新消费者或使用新数据更新消费者时,您只需给他们一个std::shared_ptr到新的std::vector.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL向量和线程安全 的相关文章

随机推荐