繁体   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