从不同的线程编写共享变量,我打算用QMutex做,如果我将mutex变量声明为extern变量,我可以用它来读取和写入来自不同源文件的单独的两个函数吗?
像
header.hpp
extern QMutex mutex;
extern int data;
src1.cpp //在一个帖子中
int read(){
int tmp;
mutex.lock();
tmp=data;
mutex.unlock();
return tmp;
}
src2.cpp //在另一个帖子中
void write(int val){
mutex.lock();
data=val;
mutex.unlock();
}
基本上我需要的只是一个线程应该一次访问共享变量进行读取或写入,在这种情况下我可以用这种方式使用互斥吗?
任何帮助将不胜感激.. 谢谢 哈里斯
答案 0 :(得分:1)
是的,原则是正确的(假设您打算写return tmp;
而不是return data;
)。不要忘记在一个源文件中定义mutex
和data
(它们可以位于同一个文件中,也可以位于不同的文件中)。
但是,使用RAII类(互斥锁柜)而不是使用显式锁定和解锁通常会更好,代码看起来像这样:
int read()
{
QMutexLocker l(&mutex);
return data;
}
void write(int val)
{
QMutexLocker l(&mutex);
data = val;
}
互斥锁定器在其构造函数中锁定互斥锁,并在其析构函数中再次解锁它(当l
超出范围时会自动调用它)。这样,即使出现异常,也永远不会忘记解锁互斥锁。
作为旁注,如果您要保护的数据实际上只是一个int
,那么最好使用原子变量(例如QAtomicInt
)而不是变量+互斥对。