use*_*107 5 c++ multithreading mutex deadlock vector
是否可以使用互斥锁来锁定向量中的元素而不是整个向量?
例如,给定一个向量 myVec;将 10 个元素推回 myVec
for (int i = 0; i < 10; ++i)
{
buffer myBuf = i; // actually myBuf is not necessarily int.
myVec.push_back(myBuf);
}
Run Code Online (Sandbox Code Playgroud)
向量的每个元素将被多个线程异步更改。如何使用互斥锁仅锁定 myVec 中的一个缓冲区,以便一个线程可以写入或读取元素;另一个可以同时读写另一个元素吗?
谢谢
你想要的比你想象的更简单也更困难:
如果你的容器作为一个整体没有改变,即没有插入或擦除,那么标准库容器已经提供了一种有限类型的线程安全,即允许不同的线程读取或修改不同的容器元素,即只要不超过一个线程访问任何给定元素。
另一方面,如果将容器作为一个整体进行修改,那么您几乎没有任何安全性:根据容器的类型,您绝对必须了解引用和迭代器失效。如果您知道对元素的引用或迭代器不受影响,则上述内容适用(分别适用于引用或取消引用的迭代器)。如果没有,那么除了重新获取对所需元素的新引用之外,您别无希望。
如果向量在启动时初始化,它就像一个固定大小的数组,因此不需要锁定它。如果需要的话,我更喜欢用 new[] 分配一个数组:)。
比方说,如果线程N仅访问fieldN,则不需要任何锁,则当多个线程尝试访问读和写同一资源时需要锁。
如果一个线程只访问一种资源进行读写,并且该资源没有被任何其他线程访问,那么绝对没有问题!你不需要任何锁。
如果多个线程之间仅以只读模式访问一个资源,则不需要任何锁。
如果不清楚,在您的情况下,array[i]是读/写资源,而array是共享只读资源。
如果需要同步每个元素,则需要每个元素都有一个互斥体。如果有n个资源被m个线程访问,则需要使用n个互斥锁来锁定资源。它们并不昂贵。
如果您确实拥有太多资源,则可以锁定数组的部分内容:单个互斥锁将使您的应用程序成为单线程,但例如,您可以每 10 个项目分配 1 个互斥锁。通过这种方式,您可以减少互斥量的数量,但同时可以确保不会有太多线程停滞在一起。