我很好奇,互斥锁如何知道要保护哪些数据以及哪些数据不受保护。我在Qt中一直使用互斥锁(mutices?),QMutex
没有指定要锁定的任何特定成员。
我想到的一个想法是,互斥锁不会锁定任何资源,而是锁定在资源上工作的例程,并且为了使该例程工作,必须解锁互斥锁。但这意味着如果我可以获得指向该资源的指针,我仍然可以在另一个没有通过可锁定例程的线程中修改它,这意味着实际上不可能完全保护内存中的某个区域,只有通过一个可锁定的例程才能访问它,它才能受到保护。这是对的吗?
答案 0 :(得分:7)
是的,你是对的。互斥锁保证代码一次只能由一个线程访问,而不是 data 。
但您可以通过封装来保护数据:将受保护资源放在私有字段中,并使get / set访问者使用互斥锁来协调访问。这种“包装”称为监视器http://en.wikipedia.org/wiki/Monitor_(synchronization)。
答案 1 :(得分:4)
这是对的。 Mutex只锁定一个线程。它不会锁定资源。您仍然可以通过直接内存操作访问它。所以从这个意义上说它不安全(但另一方面没有什么可以阻止你直接操作内存)。但你永远不应该这样做。这就是为什么存在抽象层的原因。