【发布时间】:2012-10-29 08:08:46
【问题描述】:
我了解线程安全的概念。在尝试保护单个变量时,我正在寻找简化线程安全的建议。
假设我有一个变量:
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)锁定单个变量而不需要一个大类,这比创建一个互斥锁更安全吗?
【问题讨论】:
-
这个变量是全局变量吗?我认为您没有太多其他选择.. 除非您想创建一个通用的线程安全容器类 - 如果您必须对第二个变量执行此操作,这将为您节省一些代码。
-
你的意思是像一个模板类?听起来不错。
-
另外,您的设计是否可以复制 var? apass 是一个类,因此我可以拥有任意数量的对象
-
是的,但是如果我想保护一个 int 怎么办? 2 个类,现在一个 char 和一个 time_t,4 个类......等等
-
如果您支持 C++11,请使用
std::atomic<double>。
标签: c++ multithreading thread-safety