互斥锁是全局锁定对变量的访问,还是只锁定与锁定的互斥锁在同一范围内的变量?
请注意,我必须更改此问题的标题,因为很多答案似乎对我所问的内容感到困惑。这不是关于“互斥对象”的范围(全局或其他)的问题,而是关于哪些变量范围被互斥锁“锁定”的问题。
我相信答案是互斥锁锁定了对所有变量的访问,即;所有全局和局部范围的变量。 (这是互斥锁阻塞线程执行而不是访问特定内存区域的结果。)
我正在尝试理解互斥体。
我试图了解互斥锁将锁定哪些内存部分,或者等效地,哪些变量。
但是我从网上阅读的理解是,互斥锁不锁定内存,它们锁定(或阻止)同时运行的线程,这些线程都是同一进程的成员。 (对吗?)
https://mortoray.com/2011/12/16/how-does-a-mutex-work-what-does-it-cost/
所以我的问题变成了简单的“互斥锁是全局性的吗?”
...或者他们可能是“一般来说是全局性的,但 stackoverflow 社区可以想象一些他们不是的特殊情况?”
最初考虑我的问题时,我对以下示例中显示的内容感兴趣。
// both in global scope, this mutex will lock any global scope variable?
int global_variable;
mutex global_variable_mutex;
int main()
{
// one thread operates here and locks global_variable_mutex
// before reading/writing
{
// local variables in a loop
// launch some threads here, and wait later
int local_variable;
mutex local_variable_mutex;
// wait for launched thread to return
// does the mutex here prevent data races to the variable
// global_variable ???
}
}
人们可能会认为这是 C++ 或 C 或任何其他类似相关语言的伪代码。
2021 年编辑:问题标题已更改,以更好地反射(reflect)问题的内容和相关答案。
最佳答案
So my question has become simply "are mutexes global?"
没有。互斥锁有一个 lock() 和一个 unlock() 方法,互斥锁唯一要做的就是让其 lock() 调用(来自任何线程)不返回,只要另一个线程锁定了该互斥锁。当持有互斥锁的线程调用 unlock() 时,即 lock() 调用将在第一个线程中返回。这样可以保证只有一个线程将持有互斥锁(即在任何给定时间在其 lock() 调用和其 unlock call() 之间的区域中执行)。
这就是它的全部内容。因此,互斥锁只会影响对该特定互斥锁调用 lock() 的线程,不会影响其他任何线程。
关于multithreading - 互斥锁是如何工作的?互斥锁是否全局保护变量?定义它的范围重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37792052/