![](/img/trans.png)
[英]Check to see if a pthread mutex is locked or unlocked (After a thread has locked itself)
[英]Why is another thread, say B running when pthread_mutex is being locked and unlocked inside thread A?
根據手冊頁
pthread_mutex_lock鎖定給定的互斥鎖。 如果該互斥鎖當前已解鎖,則它將被調用線程鎖定並擁有,並且pthread_mutex_lock立即返回。 如果互斥鎖已經被另一個線程鎖定,則pthread_mutex_lock會暫停調用線程,直到互斥鎖被解鎖為止。
我了解的是, line 3
執行main thread
擁有mtx
所有權。 然后執行關鍵區域操作,然后到達line 4
並解鎖mtx
。 我的問題是-
mtx
鎖定時,其他線程可以同時運行嗎? line 2
的用途是什么,因為newThread
僅在執行line 4
newThread
才能解鎖mtx
,從而使line 2
成為多余的? 如果line 1
未注釋怎么辦?
#include<stdio.h> #include<pthread.h> #include<semaphore.h> #include<unistd.h> sem_t bin_sem; pthread_mutex_t mtx; char message[100]; void * thread_function(void * arg) { int x; char message2[10]; while(1) { // pthread_mutex_lock(&mtx); //line 1 printf("thread2 : waiting..\\n\\n"); sem_wait(&bin_sem); printf("hi i am the new thread waiting inside critical..\\n"); scanf("%s",message); printf("You entered in newthread:%s\\n\\n",message); sem_post(&bin_sem); pthread_mutex_unlock(&mtx); //line 2 } } int main(void) { pthread_t athread; pthread_attr_t ta; char message2[10]; int x; sem_init(&bin_sem,0,1); pthread_mutex_init(&mtx,NULL); pthread_attr_init(&ta); pthread_attr_setschedpolicy(&ta,SCHED_RR); pthread_create(&athread,&ta,thread_function,NULL); while(1) { pthread_mutex_lock(&mtx); //line 3 printf("main waiting..\\n\\n"); sem_wait(&bin_sem); printf("hi i am the main thread waiting inside critical..\\n"); scanf("%s",message); printf("You entered in main:%s\\n\\n",message); sem_post(&bin_sem); pthread_mutex_unlock(&mtx); //line 4 } sleep(5); }
互斥鎖是一種用於實現關鍵部分的機制。
在pthread_mutex_lock(x)
和pthread_mutex_unlock(x)
調用之間的任何代碼將在任何給定時間僅在一個線程中執行。 就這樣。
所以...
1. mtx鎖定時,另一個線程可以同時運行嗎?
如果它沒有鎖定mtx,那么當然可以。
2.第2行的用途是什么,因為newThread僅在執行第4行時才能解鎖mtx,從而使第2行成為多余的?
互斥鎖變得無用,並且由於在未鎖定它的線程中對其進行解鎖,因此您也得到了UB :
如果互斥鎖類型為
PTHREAD_MUTEX_DEFAULT
...
如果未由調用線程鎖定互斥鎖,則嘗試對其進行解鎖會導致未定義的行為。
(默認情況下,您獲得互斥鎖類型PTHREAD_MUTEX_DEFAULT
)
3.如果第1行未注釋怎么辦?
因為互斥鎖幾乎一直被鎖定,並且在解鎖后立即重新鎖定,所以您會遇到線程 飢餓的情況 (POSIX不保證互斥鎖的公平性)。
在某些情況下(當您使用SCHED_FIFO
或SCHED_RR
調度程序時),POSIX 信號量確實提供了公平性,但是它比較重 。
我不太了解您要實現的目標(該應用程序看起來很虛構)。 在實際的應用程序中,可能需要對每個線程需要采取的操作進行某種邏輯排序。 因此,如果該信號量對您有用,我將保留該信號量並刪除互斥量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.