众所周知,
互斥锁的任务是保护对象不被占有互斥锁的线程以外的其他线程访问。在任何给定时刻,只有一个线程可以拥有受互斥体保护的对象。如果另一个线程需要访问受互斥锁保护的变量,则该线程将阻塞直到互斥锁被释放。
但是互斥体如何确定要阻塞的资源/对象/变量呢?毕竟,没有参数传递给它,它可以从中知道要保护什么。
std::mutex如果有的话,我们正在谈论c++11。
众所周知,
互斥锁的任务是保护对象不被占有互斥锁的线程以外的其他线程访问。在任何给定时刻,只有一个线程可以拥有受互斥体保护的对象。如果另一个线程需要访问受互斥锁保护的变量,则该线程将阻塞直到互斥锁被释放。
但是互斥体如何确定要阻塞的资源/对象/变量呢?毕竟,没有参数传递给它,它可以从中知道要保护什么。
std::mutex如果有的话,我们正在谈论c++11。
我将添加到@alexis031182 的回答中。
互斥量或信号量,作为其概括(具体而言,位于某个地址的对象(变量))是一个或(在某些情况下)多个进程的代码流的同步点。
仅此而已。它不保护任何东西。既不是内存中的对象,也不是代码段。不
lock使用此互斥量调用操作的线程可以对任何变量和代码段做任何它想做的事情。保护是在逻辑级别(在开发人员的头脑中)执行的。事实上,调用
lock指定互斥量操作的代码线程会递增与该互斥量关联的计数器,并在计数器为零时继续执行。否则,该线程一直等到计数器为 0(然后它会依次递增并继续运行),这会在有人调用
unlock将计数器减 1 时发生。任何互斥锁都有函数lock和unlock(它们可以有不同的调用方式,但本质是不变的。有些互斥锁可以使用raii,自动调用必要的函数)。
并且它保护了一段如果互斥量处于锁定状态则无法执行的代码。即一个mutex可以保护多个不同的地方,它们不会同时执行(与多线程执行有关)。另一方面,系统中可以同时存在多个互斥锁,互不干扰。
其实也没办法。它不保护特定对象。
互斥量仅确保对互斥量下的数据的访问被序列化。(也就是说,数据竞争是不可能的。)使用正确的对象的责任在于你,程序员。
您所描述的并没有告诉您互斥锁的作用,只是它的用途以及您可以(自己)用它做什么。
互斥锁本质上提供了所谓的“临界区”(critical section)——即 一次只能由一个线程执行的代码。
但是如果这个互斥锁挂在访问某个变量的代码上,那么它似乎保护的是对象,而不是代码片段。
请允许我打个比喻……谁起得早,谁就穿拖鞋。没有必要在他们身上标明这个事实。首先穿上 - 自己,你赢了。因此,谁没有时间,他迟到了,并且在释放这种有用但完全不可分割的资源之前,他将保持沮丧的期望。当然,这个例子在某种程度上有些牵强,因为现实生活中不排除武力解决的可能。但我们谈论的是互斥体,因此对财产再分配过程的无条件控制是不言而喻的。只有这次第一个成功的幸运者的善意,才会允许另一个人使用渴望得到安慰的对象。
我会完成我自己。
对于拖鞋,这个寓言是行不通的,因为许多人可以想象没有它们的工作生活。重点不在于拖鞋,而在于性能。通过互斥锁,一个线程的执行上下文锁定/释放另一个或其他线程的执行上下文。所以-是的,拖鞋与它无关,它在头上。