gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:01:17 24 4
gpt4 key购买 nike

如果我有一个可以由后台线程修改的类的私有(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com