当pthread_mutex在线程A中被锁定和解锁时,为什么另一个线程(例如B)正在运行?

时间:2018-11-28 20:08:32

标签: c linux multithreading pthreads mutex

根据手册页

  

pthread_mutex_lock锁定给定的互斥锁。如果当前已解锁互斥锁,则该互斥锁将被调用线程锁定并拥有,并且          pthread_mutex_lock立即返回。如果互斥锁已被另一个线程锁定,则pthread_mutex_lock会挂起调用线程          直到互斥锁解锁。

我了解的是line 3执行main thread时拥有mtx的所有权。然后,它执行关键区域动作,然后到达line 4并解锁mtx。我的问题是-

  1. mtx被锁定时,另一个线程可以同时运行吗?
  2. line 2仅在执行newThread后才能解锁mtx,从而使line 4成为多余,因此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);       
    }
    

1 个答案:

答案 0 :(得分:1)

互斥锁一种用于实现关键部分的机制。

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行未注释会怎样?

您会得到thread starvation,因为互斥锁几乎一直都处于锁定状态,并且在解锁后会立即重新锁定(POSIX不保证互斥锁的公平性)。

在某些情况下(当您使用SCHED_FIFOSCHED_RR调度程序时,POSIX semaphore确实提供了公平性,但是heavier就是这样。

我不太了解您要实现的目标(该应用程序看起来很虚构)。在实际的应用程序中,可能需要对每个线程需要采取的操作进行某种逻辑排序。因此,如果该信号量对您有用,那么我将保留该信号量并删除互斥量。