是否可以使用互斥锁来锁定数据结构中的一个元素?



是否可以使用互斥锁来锁定数据结构中的一个元素?例如

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]。

谢谢

如果你能保证没有人修改容器本身(通过inserterase等),那么只要每个线程访问容器的不同的元素,你应该没事。

如果需要对每个元素进行锁定,可以修改元素类型,使其提供同步访问。

映射的每个元素都需要一个不同的互斥锁。您可以使用互斥锁的映射或将互斥锁添加到映射的类型(在您的示例中是int,因此如果不创建像SharedInt这样的新类,则无法做到这一点)

互斥锁锁定可执行区域而不是对象。我总是考虑锁定读取/修改线程对象的任何代码区域。如果一个对象在一个区域内被锁定,但该对象在另一个非同步代码区域内可以访问,那么当然是不安全的。在您的情况下,我将锁定对整个对象的访问权限,因为从容器中插入和读取很容易经历上下文切换,从而增加数据损坏的可能性。

互斥是关于纪律的。一个线程可以调用write,另一个线程可以调用write1。c++运行时将假定它是有意的。但大多数情况下,这并不是程序员想要的。总结是只要所有线程/方法都遵循纪律(理解临界区并尊重它)就会有一致性。

int i=0;
Write()
{
    //Lock 
    i++;
    //Unlock
}
Write1()
{
    i++;
}

最新更新