我理解“线程安全”的概念。我正在寻求建议,以简化在尝试保护单个变量时的线程安全。
假设我有一个变量:
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);
但是,如果有新成员加入项目,或者您忘记锁定一次会怎样呢?我不喜欢调试线程问题,它们很难。
是否有一种好的方法(使用pthread,因为我必须使用支持较少的boost的QNX)可以锁定单个变量而无需创建一个大类,并且比仅创建互斥锁更安全?
std::atomic<double>
。 - rasmus