【发布时间】:2013-10-05 11:40:34
【问题描述】:
我有一个“侦听器”线程,它查看std::vector“接收者”,将其放入大小为receivers.size() 的数组中,并在其上执行MPI_Waitany,它将返回数组中的索引完成接收操作的元素。
完成的元素然后通过以下方式从接收者向量中删除:
receivers.erase(receivers.begin() + completed_index);
但是,其他线程可以在此过程中将元素推送到“接收者”向量,通过:
receivers.push_back(receiver_message);
这很危险吗?我知道如果添加的元素导致 C++ 调整向量的大小,迭代器可能会变得无效,但是由于我擦除中的迭代器发生在一个点然后被丢弃,这不是我的目的的原子操作吗?
如果需要锁定,我是否需要在每次想要访问向量的任何元素时锁定向量?例如
MPI_Start(&(receivers.at(0)->request));
即使元素 0 从不改变也需要锁? ('request' 只是元素的一个成员)
谢谢
【问题讨论】:
标签: c++ multithreading vector mpi