我了解线程安全的概念。我正在寻找在尝试保护单个变量时简化线程安全的建议。
假设我有一个变量:
double aPass;
我想保护这个变量,所以我创建了一个互斥体:
pthread_mutex_t aPass_lock;
现在我可以想到两种好方法,但它们都有令人讨厌的缺点。首先是创建一个线程安全类来保存变量:
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;
};
现在这将保留aPass
完全安全,不会出错,永远不要碰它,耶!然而,看看这些乱七八糟的东西,想象一下访问它时的混乱。总的。
另一种方法是让它们都可访问,并确保在使用 aPass 之前锁定互斥锁。
pthread_mutex_lock(aPass_lock);
do something with aPass
pthread_mutex_unlock(aPass_lock);
但是,如果有新人加入该项目,或者您有一次忘记锁定它怎么办?我不喜欢调试线程问题,它们很难。
有没有一种好方法(使用pthreads,因为我必须使用几乎没有boost支持的QNX)来锁定单个变量而不需要一个大类,这比只创建一个互斥锁来配合它更安全?
std::atomic<double> aPass;
前提是你有 C++11。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)