【发布时间】:2013-10-03 06:10:11
【问题描述】:
我需要实现一个有两种工作方式的互斥锁:1. 保护资源免受多个类的影响,以及 2. 保护资源免受类中的方法的影响,该类是插槽并且可能是可重入的。例如(伪 C++):
Class A {
function aaa() {
QMutex mutex;
mutex.lock();
globalvar++;
mutex.unlock()
}
}
Class B {
function bbb() {
QMutex mutex;
mutex.lock();
globalvar++;
mutex.unlock()
}
}
我读到了this posting,它说场景 2 被覆盖,因为 A.aaa 被 A.aaa 中断处理(不知何故 Qt/OS 知道它是被保护的同一个资源。对吧?
至于保护同一个资源的 A.aaa 和 B.bbb 我认为它不会起作用,因为 Qt/OS 不知道它的同一个资源/互斥体?这是否意味着变量 mutex 需要是全局变量,以便多个不相关的类可以安全地访问它?
【问题讨论】:
-
Mutex 与受保护的资源相关联,而不是与访问该资源的类相关联。因此,在您的简单情况下,当资源是全局变量时,互斥锁也应该是全局变量。
-
操作系统对受保护的资源一无所知。在堆栈上创建的不与其他线程共享的互斥锁不会保护任何东西。所有访问 globalvar 的线程必须共享同一个互斥体实例。因此,互斥锁应与要保护的数据在同一范围内。