我想問你一些基本的事情,但它真的困擾我很多。 我目前正在爲系統編程學習'pthread mutex',並據我所知,當'pthread_mutex_lock'被調用時,只有當前線程被執行而沒有其他線程被執行。我能這樣想嗎?pthread mutex如何解鎖工作?線程同時出現嗎?
當談到'pthread_mutex_unlock'時,當調用這個函數時,當前線程是否將鎖定權限傳遞給其他線程,並等待其他線程再次解鎖函數?還是包含當前線程的每個線程都同時執行,直到其中一個線程調用鎖定函數?
這裏是我學習的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
enum { STATE_A, STATE_B } state = STATE_A;
pthread_cond_t condA = PTHREAD_COND_INITIALIZER;
pthread_cond_t condB = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *threadA()
{
printf("A start\n");
int i = 0, rValue, loopNum;
while(i<3)
{
pthread_mutex_lock(&mutex);
while(state != STATE_A)
{
printf("a\n");
pthread_cond_wait(&condA, &mutex);
}
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&condB);
for(loopNum = 1; loopNum <= 5; loopNum++)
{
printf("Hello %d\n", loopNum);
}
pthread_mutex_lock(&mutex);
state = STATE_B;
printf("STATE_B\n");
pthread_cond_signal(&condB);
pthread_mutex_unlock(&mutex);
i++;
}
return 0;
}
void *threadB()
{
printf("B start\n");
int n = 0, rValue;
while(n<3)
{
pthread_mutex_lock(&mutex);
while (state != STATE_B)
{
printf("b\n");
pthread_cond_wait(&condB, &mutex);
}
pthread_mutex_unlock(&mutex);
printf("Goodbye\n");
pthread_mutex_lock(&mutex);
state = STATE_A;
printf("STATE_A\n");
pthread_cond_signal(&condA);
pthread_mutex_unlock(&mutex);
n++;
}
return 0;
}
int main(int argc, char *argv[])
{
pthread_t a, b;
pthread_create(&a, NULL, threadA, NULL);
pthread_create(&b, NULL, threadB, NULL);
pthread_join(a, NULL);
pthread_join(b, NULL);
}
我有種修改了一些原廠配件,以確保發生了什麼事在此代碼,如添加的printf(「A開始\ n」)的printf (「a \ n」)等等。
這裏有一些輸出:
輸出1個
B start
b
A start
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
b
STATE_B
a
Goodbye
STATE_A
b
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
b
STATE_B
a
Goodbye
STATE_A
b
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
b
STATE_B
Goodbye
STATE_A
輸出2
B start
b
A start
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
STATE_B
a
Goodbye
STATE_A
b
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
STATE_B
a
Goodbye
STATE_A
b
Hello 1
Hello 2
Hello 3
Hello 4
Hello 5
STATE_B
Goodbye
STATE_A
所以我才知道,線程調用的時候,他們被同時調用。基於這個邏輯,我在每個線程函數'threadA()和threadB()'的開頭添加了'printf(「A start \ n」)'和'printf(「B start \ n」)'「。但總是'printf(「B start \ n」)'首先出現。如果他們同時被調用,那麼他們是不是必須交替出現,至少是隨機的?因爲我猜想ThreadA中的'pthread_mutex_unlock'調用ThreadB並等待ThreadB調用解鎖函數,所以我假設'Goodbye'消息始終應該早於'a'。我想知道這個代碼是如何工作的。
我猜我會完全錯誤的,誤解了很多部分,因爲我是這個領域的新手。但想得到答案。感謝您閱讀這篇:)
您的問題太過於集中。請一次提出一個具體問題並直接指出問題。如果鎖已被佔用,pthread_mutex_lock將掛起調用線程。當另一個線程調用pthread_mutex_unlock時,內核將選擇當前pthread_mutex_locked被阻塞的線程(如果有的話)並解除阻塞(安排它執行)。 – kaylum