当其他线程尝试读取时push_back向量 - 争用条件?[复制]

push_back to a vector while other threads try to read - race condition? [duplicate]

提问人:Urwald 提问时间:11/14/2023 更新时间:11/14/2023 访问量:91

问:

我有一个函数,可以将元素添加到一个中,并在给定的线程中运行:std::vector

// called in one thread    
void foo(std::vector<int>& v) {
  // use v.push_back()
}

让其他线程使用基于范围的循环尝试读取是否安全?forv

// called in other threads
void g(std::vector<int>& v) {
  for(const auto& elem:v) {
    // read only
  }
}

在我看来,这可能是一个竞争条件,因为当其他线程尝试读取它时,大小可能会改变。这确实是不安全的代码吗?v

C++ 多线程并 争用条件

评论

0赞 Alan Birtles 11/14/2023
是的,绝对不安全,特别是如果向量重新分配会发生非常糟糕的事情
0赞 πάντα ῥεῖ 11/14/2023
“这确实是不安全的代码吗?”是的。
0赞 Pete Becker 11/15/2023
这是一个争用条件,因为一个线程正在修改数据,而一个或多个其他线程正在读取数据。句点。无需考虑幕后可能发生的事情。

答:

0赞 Jesper Juhl 11/14/2023 #1

这是一个经典的争用条件。您需要一个锁(如 )来保护防止并发访问。std::mutexvector