如果我在函數中的兩個不同位置鎖定相同的互斥鎖,並且當一個線程位於其中一個線程中並且第二個線程到達另一個線程時發生上下文切換,它會被封鎖嗎?線程在同一互斥鎖的多個鎖上的行爲
我會試着給出一個簡單的例子,我的意思是,也許它會更清晰。 說我有下面的代碼在一個文件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