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

标签 c++ multithreading pthreads

如果我有一个可以由后台线程修改的类的私有(private)成员,以及该私有(private)成员的 getter,我可以使用对该私有(private)成员的 const 引用作为 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);

};

最佳答案

不幸的是,从技术上讲,你应该保护 setter/getter ,因为 int operations are not guaranteed to be atomic .

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

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

关于c++ - 使用 pthread 和引用保护 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20789946/

相关文章:

c# - 为什么 ReaderWriterLock 在所有者线程终止时不自动释放/退出?

linux - 为什么计划策略和参数的设置在我的程序 - pthread Linux 中失败?

c - pthread_mutex_lock 在 C 中返回 22

c++ toupper() 比较两个字符串

c++ - QTcpSocket - 检查是否已连接

c++ - CMake:CMAKE_REQUIRED_LIBRARIES 中的库顺序,用于在配置时测试最小程序

PHP pthreads : Thread dosen't executes methods from other objects async

c++ - 嵌套if ... else语句如何胜过C++中的一系列单选if语句

c# - 使用 Task.Factory.StartNew 和 Thread.Sleep 等待 x 秒

c - 尝试使用线程在 C 中按顺序打印数字