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