QMutex 访问共享变量
QMutex Access shared variable
从不同的线程写入共享变量,我打算用 QMutex 做,如果我将互斥变量声明为外部变量,我可以使用它在来自不同源文件的单独两个函数中进行读写吗?
喜欢
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();
}
基本上我需要的是一次只有一个线程访问共享变量进行读取或写入,在这种情况下我可以这样使用互斥锁吗?
任何帮助将不胜感激..
谢谢
哈里斯
是的,原则是正确的(假设你打算写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
)而不是变量+互斥对。
从不同的线程写入共享变量,我打算用 QMutex 做,如果我将互斥变量声明为外部变量,我可以使用它在来自不同源文件的单独两个函数中进行读写吗?
喜欢
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();
}
基本上我需要的是一次只有一个线程访问共享变量进行读取或写入,在这种情况下我可以这样使用互斥锁吗?
任何帮助将不胜感激.. 谢谢 哈里斯
是的,原则是正确的(假设你打算写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
)而不是变量+互斥对。