RaG*_*__M 6 c++ multithreading mutex c++11
它可能听起来很虚,但是,有点混乱,我已经经历了这个问题,当我们看到它们在同样的情况下,我必须使我的map静态所以它将是所有实例将是共同的在单独创建的threads,我要同步要去我的地图的行为的功能,所以我想制作的std::mutex是static在我的课像有人提出什么作为给定链路的答案.在这种情况下,会不会有任何竞争条件是为了获取和锁定mutex自己?是否有更好的方法可以同步static map使用的功能mutex
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)
| 归档时间: |
|
| 查看次数: |
1297 次 |
| 最近记录: |