根据手册页
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);
}
答案 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_FIFO
或SCHED_RR
调度程序时,POSIX semaphore确实提供了公平性,但是heavier就是这样。
我不太了解您要实现的目标(该应用程序看起来很虚构)。在实际的应用程序中,可能需要对每个线程需要采取的操作进行某种逻辑排序。因此,如果该信号量对您有用,那么我将保留该信号量并删除互斥量。