c++ - 在 std::vector 上运行的多个线程:在这种情况下我需要锁吗?

标签 c++ multithreading vector mpi

我有一个“监听器”线程,它查看 std::vector“接收器”,将其放入大小为 receivers.size() 的数组中,然后对其执行 MPI_Waitany,这将返回数组中完成接收操作的元素的索引。

完成的元素然后通过以下方式从接收器 vector 中删除:

receivers.erase(receivers.begin() + completed_index);

但是,其他线程可以在此过程中通过以下方式将元素推送到“接收者” vector :

receivers.push_back(receiver_message);

这很危险吗?我知道如果添加的元素导致 C++ 调整 vector 的大小,迭代器可能会变得无效,但是由于我删除中的迭代器发生在一个点上,然后被丢弃,这对我来说不是一个原子操作吗?

如果需要锁定,那么我是否需要在每次访问 vector 的任何元素时都锁定 vector ?例如

MPI_Start(&(receivers.at(0)->request));

即使元素 0 永远不会更改,也需要锁定吗? ('request'只是元素的一个成员)

谢谢

最佳答案

简单的规则是,如果任何线程要写入 vector (粗略地翻译为“以任何方式修改它”),那么您需要为所有线程使用锁以实现一致的 View 。

当且仅当 vector 是严格只读的时,你可以不用锁。

关于c++ - 在 std::vector 上运行的多个线程:在这种情况下我需要锁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19080162/

相关文章:

c++ - Debian 8.1 Jessie 中的 g++ errno_t 和 fopen_s 错误

c# - 如何在第二个线程上等待事件

c++ - 如何正确返回一个大 vector

C++ 在不复制 c 数组的情况下分配 N 维 vector

c++ - 构造函数中的奇怪行为

c++ - 拒绝访问注册表

c++ - std::lock() 相当于 boost::shared_mutex?

c++ - 如何在循环中将元素添加到空 vector ?

c++ - 在 Vulkan 中,每个交换链图像、每个帧或每个命令池是否需要专用的栅栏/信号量?

multithreading - 简单的多线程Haskell占用大量内存