Multithreading 互斥锁如何知道要锁定哪些数据(以及不锁定哪些数据)?

Multithreading 互斥锁如何知道要锁定哪些数据(以及不锁定哪些数据)?,multithreading,thread-safety,mutex,implementation,Multithreading,Thread Safety,Mutex,Implementation,我很好奇互斥体如何知道要保护哪些数据和不保护哪些数据。我一直在Qt中使用互斥体(mutices?),而QMutex没有指定要锁定的任何特定成员 我想到的一个想法是,互斥锁不锁定任何资源,而是锁定一个在资源上工作的例程,为了让该例程工作,互斥锁必须解锁。但这意味着,如果我可以获取指向该资源的指针,我仍然可以在另一个线程中修改它,而该线程不经过可锁定例程,这意味着实际上不可能完全保护内存中的某个区域,只有通过单个可锁定例程才能访问该区域,才能对其进行保护。对吗?对。互斥锁只锁定一个线程。它不会锁定资

我很好奇互斥体如何知道要保护哪些数据和不保护哪些数据。我一直在Qt中使用互斥体(mutices?),而
QMutex
没有指定要锁定的任何特定成员


我想到的一个想法是,互斥锁不锁定任何资源,而是锁定一个在资源上工作的例程,为了让该例程工作,互斥锁必须解锁。但这意味着,如果我可以获取指向该资源的指针,我仍然可以在另一个线程中修改它,而该线程不经过可锁定例程,这意味着实际上不可能完全保护内存中的某个区域,只有通过单个可锁定例程才能访问该区域,才能对其进行保护。对吗?

对。互斥锁只锁定一个线程。它不会锁定资源。您仍然可以通过直接内存操作访问它。因此,从这个意义上讲,它是不安全的(但从另一方面来说,没有什么可以阻止你直接操纵内存)。但你不应该这样做。这就是抽象层存在的原因。

是的,你是对的。互斥锁保证代码一次只能由一个线程访问,而不是由数据访问

但是可以通过封装数据来保护数据:将受保护的资源放在私有字段中,并使get/set访问器使用互斥来协调访问。这种“包装”被称为监视器。

一定要退房。