我正在查看以下片段:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cvar;
char buf[25];
void*thread_f(void *);
int main(){
pthread_t thr;
pthread_cond_init(&cvar,NULL);
pthread_mutex_lock(&mtx);
pthread_create(&thr,NULL,thread_f,NULL);
pthread_cond_wait(&cvar,&mtx);
pthread_mutex_unlock(&mtx);
...join and destroy thread...
}
和thread_f:
void* thread_f(void* argp){
pthread_mutex_lock(&mtx);
strcpy(buf,"test");
pthread_cond_signal(&cvar);
pthread_mutex_unlock(&mtx); //why?
pthread_exit(NULL);
}
我對上面代碼的理解是,它main抓住鎖,創建執行緒并運行 thread_f 阻塞。然后,main 發出等待條件變數的信號cvar并解鎖互斥鎖。然后,thread_f解除阻塞、strcpys 和信號cvar喚醒。然后, main 和 thread_f 都解鎖互斥鎖。
這是實際行為,還是我在某處遺漏了什么?如果這是實際行為,是否沒有解鎖已經解鎖的互斥體 UB,因此最終應該洗掉他解鎖的互斥體之一嗎?
謝謝。
uj5u.com熱心網友回復:
這段代碼在做什么是有效的。
當執行緒呼叫pthread_cond_signal它時,它不會立即導致主執行緒獲取互斥鎖,而是喚醒主執行緒以便它可以嘗試鎖定它。然后一旦執行緒釋放互斥鎖,主執行緒就能夠鎖定它并從pthread_cond_wait.
uj5u.com熱心網友回復:
主pthread_cond_wait()執行緒中的 解鎖互斥鎖并等待條件發出信號 - 并在回傳之前重新鎖定互斥鎖。
子執行緒能夠鎖定互斥鎖,操作緩沖區,發出條件信號,然后解鎖互斥鎖,讓主執行緒重新獲得鎖。
因此,代碼表現良好——在具有多個子執行緒的更一般情況下,無論是否需要擔心“虛假喚醒”。我不認為你可以在這里得到一個虛假的喚醒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484761.html
