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

afsara_ben

根据手册页

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

当我的理解是line 3执行main thread具有所有权mtx然后它执行它的关键区域动作,然后到达line 4并解锁mtx我的问题是——

  1. 另一个线程在mtx被锁定时可以并发运行吗?
  2. 有什么用,line 2因为newThread只有mtxline 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);       
    }
    
生锈

互斥锁一种实现临界区的机制。

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 不保证互斥锁的公平性)。

POSIX信号量在某些情况下确实提供了公平性(当您使用SCHED_FIFOSCHED_RR调度程序时),但更重

我不太明白您要实现的目标(该应用程序看起来很做作)。在实际应用程序中,任一线程需要采取的操作可能有一些逻辑顺序。因此,如果信号量适合您,我会保留它并删除互斥锁。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章