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

RaG*_*__M 6 c++ multithreading mutex c++11

它可能听起来很虚,但是,有点混乱,我已经经历了这个问题,当我们看到它们在同样的情况下,我必须使我的map静态所以它将是所有实例将是共同的在单独创建的threads,我要同步要去我的地图的行为的功能,所以我想制作的std::mutexstatic在我的课像有人提出什么作为给定链路的答案.在这种情况下,会不会有任何竞争条件是为了获取和锁定mutex自己?是否有更好的方法可以同步static map使用的功能mutex

Whi*_*TiM 7

Make std::mutexas static会为互斥锁本身创建竞争条件

不,Mutex不易受竞争条件的影响.至于初始化它static,你是安全的.

$ 6.7:4:第一次控制通过其声明时,执行具有静态存储持续时间([basic.stc.static])或线程存储持续时间([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
};
Run Code Online (Sandbox Code Playgroud)

现在:

//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
Run Code Online (Sandbox Code Playgroud)