如果我在函数中的两个不同位置锁定相同的互斥锁,并且当一个线程位于其中一个线程中并且第二个线程到达另一个线程时发生上下文切换,它会被封锁吗?线程在同一互斥锁的多个锁上的行为
我会试着给出一个简单的例子,我的意思是,也许它会更清晰。 说我有下面的代码在一个文件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中,我有创建两个线程,thread1
和thread2
,都运行testMutex
功能的主要功能。 thread1
首先被执行,而在函数的第二部分( - 部分,在printf
之后),在mutex被解锁之前,thread2
从函数开始运行。 将thread2
能够执行globalVar++
,还是会保持阻止状态,等待互斥锁被解锁?
在此先感谢!
我不认为有这个代码将工作的任何实现。相反,'pthread_mutex_lock'会锁定一个*互斥锁的副本,它不会阻塞其他线程。技术上对互斥副本执行任何操作都会导致UB,但行为几乎可以肯定地像我刚才描述的那样用于实际实现。 – 2011-06-06 19:08:53
其实您链接的FAQ中的文本是错误的。与它所说的相反,复制'pthread_t'完全有效,事实上,在标准函数中'pthread_t'的所有用法都是通过值(即使它是一个结构)而不是通过引用来传递它,除了'pthread_create',其中地址来存储结果通过。当然,'pthread_t'通常本身就是一个指向不透明数据结构的指针。 – 2011-10-15 04:47:08