线程安全单个变量

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,它几乎没有提升支持)要锁定单个变量而不需要大类,那么只需创建一个互斥锁就可以更安全吗?

Pet*_*ker 8

std::atomic<double> aPass;
Run Code Online (Sandbox Code Playgroud)

只要你有C++ 11.

  • 是的,我现在有了! (41认同)
  • 你在 reddit 上受到推荐!https://www.reddit.com/r/ProgrammerHumor/comments/liybv2/he_finally_got_c11_8_years_later/ (7认同)
  • 不幸的是,没有,我没有 C++11 (2认同)
  • 哈哈,这太棒了。而且我只是因为我搬了公司才得到它,很确定旧公司仍在 c++03 :p (2认同)