簡體   English   中英

當pthread_mutex在線程A中被鎖定和解鎖時,為什么另一個線程(例如B)正在運行?

[英]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 我的問題是-

  1. mtx鎖定時,其他線程可以同時運行嗎?
  2. line 2的用途是什么,因為newThread僅在執行line 4 newThread才能解鎖mtx ,從而使line 2成為多余的?
  3. 如果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_FIFOSCHED_RR調度程序時),POSIX 信號量確實提供了公平性,但是它比較重

我不太了解您要實現的目標(該應用程序看起來很虛構)。 在實際的應用程序中,可能需要對每個線程需要采取的操作進行某種邏輯排序。 因此,如果該信號量對您有用,我將保留該信號量並刪除互斥量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM