Fan*_*Fox 7 c++ multithreading thread-safety
我理解线程安全的概念.我正在寻求在尝试保护单个变量时简化线程安全性的建议.
说我有一个变量:
double aPass;
Run Code Online (Sandbox Code Playgroud)
我想保护这个变量,所以我创建了一个互斥锁:
pthread_mutex_t aPass_lock;
Run Code Online (Sandbox Code Playgroud)
现在有两种很好的方法可以让我想到这样做,但它们都有令人讨厌的缺点.第一个是创建一个线程安全类来保存变量:
class aPass {
public:
aPass() {
pthread_mutex_init(&aPass_lock, NULL);
aPass_ = 0;
}
void get(double & setMe) {
pthread_mutex_lock(aPass_lock);
setMe = aPass_
pthread_mutex_unlock(aPass_lock);
}
void set(const double setThis) {
pthread_mutex_lock(aPass_lock);
aPass_ = setThis;
pthread_mutex_unlock(aPass_lock);
}
private:
double aPass_;
pthread_mutex_t aPass_lock;
};
Run Code Online (Sandbox Code Playgroud)
现在,这将保持aPass完全安全,没有任何错误,永远不会碰它,是的!然而,看看所有混乱,并想象访问它时的混乱.毛.
另一种方法是让它们都可访问,并确保在使用aPass之前锁定互斥锁.
pthread_mutex_lock(aPass_lock);
do something with aPass
pthread_mutex_unlock(aPass_lock);
Run Code Online (Sandbox Code Playgroud)
但是,如果有一个新人参与该项目,如果你忘记一次锁定该怎么办呢.我不喜欢调试线程问题他们很难.
是否有一个很好的方法(使用pthreads,因为我必须使用QNX,它几乎没有提升支持)要锁定单个变量而不需要大类,那么只需创建一个互斥锁就可以更安全吗?
std::atomic<double> aPass;
Run Code Online (Sandbox Code Playgroud)
只要你有C++ 11.