如果我有一个可以被后台线程修改的类的私有成员,以及所述私有成员的getter,我是否可以对该getter使用该私有成员的const引用,或者我必须使用a来保护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);
};
答案 0 :(得分: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
,如上面的链接所示。否则优化编译器可能会进行一些不正确的优化,因为它可以假设(在你的情况下是错误的)变量不会被另一个线程设置。