同一互斥体的多个锁上的线程行为

1 c mutex pthreads

如果我在函数中的两个不同位置锁定同一个互斥锁,并且当一个线程位于其中一个线程并且第二个线程到达另一个线程时发生上下文切换,它会被阻塞吗?

我将尝试举一个简单的例子来说明我的意思,也许会更清楚。假设我在文件 test.c 中有以下代码

int globalVar = 0;    

void testMutex(pthread_mutex_t myMutex) {
    pthread_mutex_lock(&myMutex);
    globalVar++;
    pthread_mutex_unlock(&myMutex);

    printf("%s \n", "Doing some other stuff here");

    pthread_mutex_lock(&myMutex);
    globalVar--;
    pthread_mutex_unlock(&myMutex);
}
Run Code Online (Sandbox Code Playgroud)

在另一个文件 main.c 中,我有一个 main 函数,它创建两个线程,thread1并且thread2,两个线程都在运行testMutex函数。 thread1首先执行,而在函数的第二部分(--部分,after printf)中,在互斥体解锁之前thread2,从函数开始开始运行。将thread2能够执行globalVar++,还是会保持阻塞状态,等待互斥锁被解锁?

提前致谢!

Nem*_*emo 5

简短的回答是“是”。

pthread_mutex_lock 文档非常清楚地说明了这一点:

互斥锁引用的互斥对象应通过调用 pthread_mutex_lock() 来锁定。如果互斥锁已被锁定,则调用线程将阻塞,直到互斥锁变得可用。此操作应返回,互斥体引用的互斥体对象处于锁定状态,调用线程作为其所有者。

换句话说,从 返回时pthread_mutex_lock,互斥锁由线程“拥有”。系统保证任何时候最多有一个线程可以“拥有”一个互斥体。