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

时间:2011-06-06 15:27:29

标签: c pthreads mutex

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

我会试着给出一个我的意思的简单例子,也许它会更清楚。 假设我在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);
}

在另一个文件main.c中,我有一个main函数,它创建两个线程thread1thread2,两个线程都运行testMutex函数。 thread1首先执行,而在函数的第二部分(部分,printf之后),在互斥锁解锁之前,thread2从函数开始执行。 thread2globalVar++能够执行{{1}},还是会被阻止,等待互斥锁解锁?

提前致谢!

5 个答案:

答案 0 :(得分:4)

简短的回答是“是”。

pthread_mutex_lock documentation非常清楚:

  

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

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

答案 1 :(得分:4)

首先,你不应该通过值传递pthread_mutex_t

void testMutex(pthread_mutex_t myMutex)

制作pthread_mutex_t*。即使您的代码可能适合您(我怀疑),但它不可移植,因为pthreads类型意味着不透明。

There's a discussion of this in the relevant FAQ。除此之外,它还暗示,每次调用pthread_mutex_t时,使用testMutex都会导致复制一个互斥锁(函数锁定复制而不是原始互斥锁。)

修好后,以下内容将成立:

由于两个线程使用相同的互斥锁,因此只要第一个线程位于两个pthread_mutex_lock中的任一个内,第二个线程就会在两个pthread_mutex_lock中的任何一个上调用{ - 1}} {{ 1}}部分。反之亦然(只要第二个线程具有互斥锁,第一个线程就会阻塞。)

换句话说,只要一个线程锁定互斥锁,就没有其他线程可以锁定相同的互斥锁。

答案 2 :(得分:1)

thread2将在pthread_mutex_lock()函数中阻塞,直到thread1解锁互斥锁。

如果没有,互斥体的目的首先是什么?

答案 3 :(得分:0)

thread2将保持阻塞状态,并且在thread1释放互斥锁之前无法增加globalVarr ++。

答案 4 :(得分:0)

函数中的位置并不重要 - 如果一个线程有互斥锁,另一个线程无法获取它。