我有一个“监听器”线程,它查看 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/