如果我有一个可以由后台线程修改的类的私有(private)成员,以及该私有(private)成员的 getter,我可以使用对该私有(private)成员的 const 引用作为 getter,还是必须使用互斥量保证安全?这是一些示例代码。请注意,我没有使用 C++11,所以我无权访问这些功能。我知道 std::atomic
和 std::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/