使用pthread和引用保护C ++类

时间:2013-12-26 19:12:12

标签: c++ multithreading pthreads

如果我有一个可以被后台线程修改的类的私有成员,以及所述私有成员的getter,我是否可以对该getter使用该私有成员的const引用,或者我必须使用a来保护getter互斥锁以确保安全?这是一些示例代码。请注意,我没有使用C ++ 11,因此我无法访问这些功能。我知道std::atomicstd::lock_guard及其用途,但我目前正在处理的代码使用C ++ 03。

值得注意的是,为简单起见,shared_member的int类型更多是占位符

如果有一种比get_copyof_shared_int()方法更好的确保安全性的方法,我很满意。但是,如果参考安全也可行,我只想确保安全。

#include <pthread.h>

using namespace std;

class testclass{

public:

// return reference to shared_member (provided only as example of ideal getter)

    inline const int& get_shared_member () const{
        return shared_member;
    }

// return copy of shared_member (example of getter known to be thread safe )

    inline const int get_copyof_shared_int () {

        pthread_mutex_lock(&shared_int_mutex);

        int shared_member_copy = shared_member;

        pthread_mutex_unlock(&shared_int_mutex);

        return shared_member_copy;

    }

// initializes shared_member and mutex, starts running background_thread
    void init(int);

private:

    volatile int shared_member; //should be marked volatile because it is used in background_thread()

    pthread_mutex_t shared_int_mutex;

    // thread which may modify shared_member 

    static void *background_thread(void *arg);

};

2 个答案:

答案 0 :(得分:1)

引用它实际上就像传递一个指针(引用通常被实现为指针上的契约层)。

这意味着无法保证您的线程在某些不方便的时间内不会读取该值,例如当另一个核心位于其他核心上时,它正在写入它。

此外,您可能希望查看C ++ 1的标题。

我还建议不要使用互斥锁内联一个getter。

const int get_copyof_shared_int () {

    std::lock_guard<std::mutex> lock(shared_int_mutex);

    return shared_int;

}

答案 1 :(得分:1)

不幸的是,从技术上讲,你应该保护自int operations are not guaranteed to be atomic以来的吸气剂。

至于吸气剂,它看起来很简单,虽然我不确定为什么你有两个不同的吸气剂。

编辑:不要忘记将共享变量标记为volatile,如上面的链接所示。否则优化编译器可能会进行一些不正确的优化,因为它可以假设(在你的情况下是错误的)变量不会被另一个线程设置。