是否可以使用互斥锁来锁定数据结构中的一个元素?
Is it possible to use mutex to lock only one element of a data structure ?
是否可以使用互斥锁来锁定数据结构中的一个元素?例如
boost::mutex m_mutex;
map<string, int> myMap;
// initialize myMap so that it has 10 elements
// then in thread 1
{
boost::unique_lock<boost::mutex> lock(m_mutex);
myMap[1] = 5 ; // write map[1]
}
// in thread 2
{
boost::unique_lock<boost::mutex> lock(m_mutex);
myMap[2] = 4 ; // write map[1]
}
我的问题:当线程1正在写入map[1]时,线程2是否可以同时写入map[2] ?线程锁定了整个map数据结构,或者只锁定了一个元素,例如map[1]或map[2]。
谢谢
如果你能保证没有人修改容器本身(通过insert
和erase
等),那么只要每个线程访问容器的不同的元素,你应该没事。
如果需要对每个元素进行锁定,可以修改元素类型,使其提供同步访问。
映射的每个元素都需要一个不同的互斥锁。您可以使用互斥锁的映射或将互斥锁添加到映射的类型(在您的示例中是int,因此如果不创建像SharedInt这样的新类,则无法做到这一点)
互斥锁锁定可执行区域而不是对象。我总是考虑锁定读取/修改线程对象的任何代码区域。如果一个对象在一个区域内被锁定,但该对象在另一个非同步代码区域内可以访问,那么当然是不安全的。在您的情况下,我将锁定对整个对象的访问权限,因为从容器中插入和读取很容易经历上下文切换,从而增加数据损坏的可能性。
互斥是关于纪律的。一个线程可以调用write,另一个线程可以调用write1。c++运行时将假定它是有意的。但大多数情况下,这并不是程序员想要的。总结是只要所有线程/方法都遵循纪律(理解临界区并尊重它)就会有一致性。
int i=0;
Write()
{
//Lock
i++;
//Unlock
}
Write1()
{
i++;
}
相关文章:
- lower_bound()返回最后一个元素
- 使用std::transform将一个范围的元素添加到另一个范围中
- 我想访问std::unique_ptr中的一个特定元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 删除映射和分割错误中的一个过去结束元素
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 仅显示链表的最后一个元素
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 查找最小的下一个更大的元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素