multithreading - 互斥锁是如何工作的?互斥锁是否全局保护变量?定义它的范围重要吗?

标签 multithreading parallel-processing mutex atomic

互斥锁是全局锁定对变量的访问,还是只锁定与锁定的互斥锁在同一范围内的变量?

请注意,我必须更改此问题的标题,因为很多答案似乎对我所问的内容感到困惑。这不是关于“互斥对象”的范围(全局或其他)的问题,而是关于哪些变量范围被互斥锁“锁定”的问题。

我相信答案是互斥锁锁定了对所有变量的访问,即;所有全局和局部范围的变量。 (这是互斥锁阻塞线程执行而不是访问特定内存区域的结果。)

我正在尝试理解互斥体。

我试图了解互斥锁将锁定哪些内存部分,或者等效地,哪些变量。

但是我从网上阅读的理解是,互斥锁锁定内存,它们锁定(或阻止)同时运行的线程,这些线程都是同一进程的成员。 (对吗?)

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/

相关文章:

r - 是否可以在多个内核上使用 JAGS 运行多个链(分割链)

c# - 如何将诊断添加到 C# 锁定功能以进行多线程调试

c++ - 多线程单例

c - Pthread同步——打印偶数奇数

c# - 将 LINQ 与 CancellationToken 一起使用的正确方法

无序和并行时的 Java 流限制和跳过行为

java - 中断System.console().readLine()?

python - 并行azure blob上传收到警告 'urllib3.connectionpool WARNING - Connection pool is full, discarding connection'

java - 多线程问题

java - 为什么 synchronized() 的位置很重要?