根据手册页
pthread_mutex_lock 锁定给定的互斥锁。如果互斥锁当前未锁定,它将被锁定并由调用线程拥有,并且 pthread_mutex_lock 立即返回。如果互斥锁已被另一个线程锁定,则 pthread_mutex_lock 将挂起调用线程,直到互斥锁解锁。
当我的理解是line 3
执行main thread
具有所有权mtx
。然后它执行它的关键区域动作,然后到达line 4
并解锁mtx
。我的问题是——
mtx
被锁定时可以并发运行吗?line 2
因为newThread
只有mtx
在line 4
被执行时才能解锁,从而变得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 不保证互斥锁的公平性)。
POSIX信号量在某些情况下确实提供了公平性(当您使用SCHED_FIFO
或SCHED_RR
调度程序时),但更重。
我不太明白您要实现的目标(该应用程序看起来很做作)。在实际应用程序中,任一线程需要采取的操作可能有一些逻辑顺序。因此,如果信号量适合您,我会保留它并删除互斥锁。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句