是否可以使用互斥锁来锁定向量中的一个元素而不是整个向量?

Is it possible to use mutex to lock an element in a vector not the whole vector?

本文关键字:向量 一个 元素 可以使 是否 锁定      更新时间:2023-10-16

是否可以使用互斥锁来锁定向量中的元素而不是整个向量?

例如,给定一个向量myVec;将10个元素推入myVec

  for (int i = 0; i < 10; ++i)
  {
          buffer myBuf = i; // actually myBuf is not necessarily int.
          myVec.push_back(myBuf);
  }

vector的每个元素将被多个线程异步修改。如何使用互斥锁在myVec中只锁定一个缓冲区,这样一个线程可以写或读一个元素;另一个可以同时读写另一个元素吗?

谢谢

你想要的比你想象的更简单,也更困难:

如果您的容器作为一个整体是不变的,即没有插入或删除,那么标准标准库容器已经提供了一种有限类型的线程安全,即允许不同的线程读取或修改不同的容器元素,即只要不超过一个线程访问任何给定的元素。

另一方面,如果整个容器被修改,那么几乎没有任何安全性:根据容器的类型,您绝对必须理解引用和迭代器的无效。如果知道对元素的引用或迭代器不受影响,则适用上述操作(分别适用于引用或解引用迭代器)。如果没有,那么除了重新获取对所需元素的新引用之外,您就没有希望做任何事情。

如果vector在启动时初始化,它就像一个固定大小的数组,因此不需要锁定它。如果你想的话,我更喜欢一个数组:)分配new[]。

如果,假设,threadN只访问fieldN,则不需要任何锁,当多个线程试图读写相同的资源时需要锁。

如果一个线程只访问一个资源进行读写,并且该资源不被任何其他线程访问,则绝对没有问题!你不需要任何锁。

如果在多个线程之间以只读模式访问一个资源,则不需要任何锁。

如果不清楚,在您的示例中,array[i]是读写资源,而array是共享只读资源。

如果需要同步每个元素,则需要为每个元素设置互斥锁。如果有m个线程访问n个资源,则需要使用n个互斥锁来锁定资源。它们不贵。

如果你有太多的资源,你可以锁定数组的一部分:一个互斥锁会使你的应用程序是单线程的,但是你可以每10个项目分配一个互斥锁,例如。通过这种方式可以减少互斥锁的数量,但同时可以确保不会有太多的线程被阻塞在一起。