是否可以使用互斥锁来锁定向量中的一个元素而不是整个向量?
Is it possible to use mutex to lock an element in a vector not the whole vector?
是否可以使用互斥锁来锁定向量中的元素而不是整个向量?
例如,给定一个向量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个项目分配一个互斥锁,例如。通过这种方式可以减少互斥锁的数量,但同时可以确保不会有太多的线程被阻塞在一起。
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 获取向量C++中第一个值和最后一个值的和
- 从多个源构造一个对象,包括一个对象向量
- 为什么一个向量上的多线程操作很慢
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何在 C++11 中查找和更新向量中的一个嵌套结构
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 将一个向量插入另一个向量的某个位置
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将指向给定子类的指针从一个向量复制到另一个向量
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 紧凑向量一个小的内存足迹向量