将std :: mutex设为静态会为互斥锁本身创建竞争条件

时间:2016-08-09 21:16:26

标签: c++ multithreading c++11 mutex

这可能听起来像是假的但是,有点困惑,我已经经历了这个question,当我们看到它们时,我们两个在同样的情况下,我必须让我的map为因此,对于将在单独的threads中创建的所有实例都是通用的,我希望同步将在我的地图上执行的函数,所以我想将std::mutex设为{{1}在我的班级中,就像在给定链接中建议作为答案一样..在这种情况下,是否会出现获取和锁定static本身的任何竞争条件?有没有更好的方法可以使用mutex

同步static map上的函数

2 个答案:

答案 0 :(得分:6)

  

std::mutex设为静态会为互斥锁创建竞争条件   本身

不,Mutex不容易受到竞争条件的影响。至于将其初始化为static,您就是安全的。

  

$6.7: 4:使用静态存储持续时间([basic.stc.static])或线程存储动态初始化块范围变量   duration([basic.stc.thread])在第一次控制时执行   通过其声明;考虑这样的变量   初始化完成后初始化。如果   初始化通过抛出异常退出,初始化是   不完整,所以下次控制进入时会再次尝试   声明。如果控件同时进入声明   变量正在初始化,并发执行应该等待   完成初始化

你说:

  

我想在我的班级中将std::mutex视为静态   建议作为给定链接的答案。

如果您尝试保护static类成员变量,请执行此操作。否则,请将其设为mutable成员。您说map全局初始化为static的事实是可以的,因为互斥量作为成员变量,将跟随套件。

class Map{
public:
    Map(...){}

    std::size_t size() const{
         std::lock_guard<std::mutex> lck(m_m);
         return m_size;
     }

     iterator add(....) {
         std::lock_guard<std::mutex> lck(m_m);
         ....
         return your_iterator;
     }

     ...etc

private:
    mutable std::mutex m_m; //FREE ADVICE: Use a std::recursive_mutex instead
    ...others
};

现在:

//Somewhere at global scope:

Map mp(... ...);

// NOTES
// 1. `mp` will be initialized in a thread safe way by the runtime. 
// 2. Since you've protected all Read or Write member functions of the class `Map`,
//    you are safe to call it from any function and from any thread

答案 1 :(得分:2)

Mutexes(和其他同步原语)是使用操作系统的支持实现的。这是他们完成工作的唯一途径。

他们执行这项工作的能力的直接证据是他们自己不容易受到竞争条件的影响 - 对互斥锁的锁定和解锁操作都是原子的。

否则,它们不会有多大用处!每次使用互斥锁时,都必须使用另一个互斥锁保护它,然后用另一个互斥锁保护该互斥锁,依此类推,直到你拥有无限数量的互斥锁为止,它们实际上都没有实现任何任何用途。 :)

具有静态存储持续时间的std::mutex对象不会以任何方式更改此设置。据推测,你正在考虑函数 - static变量(假设它们已经不具备竞争条件,必须同步,因为它们可能被不同的线程同时访问;但理想情况下,你不会&#39} ; t使用它们,因为它们使函数不可重入)。