我理解线程安全的概念。我正在寻求建议,以在尝试保护单个变量时简化线程安全性。线程安全性单个变量
说我有一个变量:
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,因为我必须使用QNX,它具有很小的增强支持)要锁定单个变量而不需要一个大的类,并且更安全,那么只需创建一个互斥锁就可以使用它?
这个变量是一个全局变量吗?我不认为你有更多的选择..除非你想做一个通用线程安全的容器类 - 这将为你节省一些代码,如果你必须这样做第二个变种。 –
你的意思是像一个模板班?听起来很不错。 –
另外,是不是有可能通过你的设计来复制var? apass是一个班级,所以我可以拥有尽可能多的对象,但我想要的是 –