如果我在我的函数中的两个不同位置锁定相同的互斥锁,并且当一个线程在其中一个中时发生上下文切换,而第二个线程到达另一个线程,它是否会被阻塞?
我会试着给出一个我的意思的简单例子,也许它会更清楚。 假设我在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函数,它创建两个线程thread1
和thread2
,两个线程都运行testMutex
函数。
thread1
首先执行,而在函数的第二部分(部分,printf
之后),在互斥锁解锁之前,thread2
从函数开始执行。
thread2
会globalVar++
能够执行{{1}},还是会被阻止,等待互斥锁解锁?
提前致谢!
答案 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)
函数中的位置并不重要 - 如果一个线程有互斥锁,另一个线程无法获取它。