2015-06-26 152 views
0

从不同线程写共享变量,我计划用QMutex做,如果我把互斥变量声明为extern变量,我可以用它来读写不同源文件中的两个函数吗?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(); 
} 

基本上我需要的只是一个线程应该访问共享变量进行读取或写入,这种情况下我可以用这种方式使用互斥锁吗?

任何帮助将不胜感激.. 感谢 哈里斯

+0

如果你真正的变量是'int'类型,你根本不需要'mutex',只需要使用'QAtomicInteger' – ixSci

+0

嗨,我只是写这个来理解我的需求,我的共享变量将是一个结构。 – Haris

回答

1

是,其原理是正确的(假设你的意思是写return tmp;而不是return data;)。不要忘记在一个源文件中定义mutexdata(它们可以在同一个文件中,也可以在不同的文件中)。

然而,这是一般最好使用RAII类(互斥锁储物柜),而不是明确的锁定和解锁这些,代码应该是这样的:

int read() 
{ 
    QMutexLocker l(&mutex); 
    return data; 
} 

void write(int val) 
{ 
    QMutexLocker l(&mutex); 
    data = val; 
} 

互斥锁储物柜锁在其构造互斥和在其析构函数中再次解锁它(当l超出范围时会自动调用它)。这样,即使存在异常,您也永远不会忘记解锁互斥锁。


作为一个侧面说明,如果你要保护的数据仅仅是一个单一的int,你可能会更好使用原子变量(如QAtomicInt),而不是一个变量+互斥对。

+0

是的,输入错误,感谢您的注意,我不知道RAII类,但在这种情况下,不需要解锁互斥锁,或者它将在退出功能时解锁。 – Haris

+0

其实我的数据是一个结构,这个代码只是我写的来表示我的情况就是这样。 – Haris

+0

@Haris是的,当函数结束时(更确切地说,当储物柜超出范围时),互斥锁将被解锁,如答案所述。 – Angew