gpt4 book ai didi

C++ 从多个线程访问 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:03 26 4
gpt4 key购买 nike

在我的程序中,我有一些线程在运行。每个线程都有一个指向某个对象的指针(在我的程序中 - vector )。每个线程修改 vector 。

有时我的程序会因段错误而失败。我认为这是因为线程 A 开始对 vector 执行某些操作而线程 B 尚未完成对它的操作?这可能是真的吗?

我该如何解决?线程同步?或者制作一个标志 VectorIsInUse 并在使用它操作时将此标志设置为 true?

最佳答案

vector 与所有 STL 容器一样,不是线程安全的。您必须自己明确地管理同步。 std::mutexboost::mutex可用于同步对 vector 的访问。

不要使用标志,因为这不是线程安全的:

  • 线程 A 检查 isInUse 标志的值,它是 false
  • 线程 A 被挂起
  • 线程 B 检查 isInUse 标志的值,它是 false
  • 线程 B 将 isInUse 设置为 true
  • 线程 B 被挂起
  • 线程 A 恢复
  • 线程 A 仍然认为 isInUsefalse 并将其设置为 true
  • 线程 A 和线程 B 现在都可以访问 vector

请注意,每个线程都必须在需要使用它的整个时间内锁定 vector。这包括修改 vector 和使用 vector 的迭代器,因为如果迭代器引用的元素是 erase()vector 进行内部重新分配。例如不要:

mtx.lock();
std::vector<std::string>::iterator i = the_vector.begin();
mtx.unlock();

// 'i' can become invalid if the `vector` is modified.

关于C++ 从多个线程访问 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12260946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com