互斥量加锁问题,有疑问
UNIX环境高级编程 程序清单12-6
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
int quitflag;
sigset_t mask;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t wait = PTHREAD_COND_INITIALIZER;
void *thr_fn(void *arg)
{
int err, signo;
for(;;)
{
err = sigwait(&mask, &signo);
if (err != 0)
{
printf("sigwait failed\n");
exit(err);
}
switch (signo)
{
case SIGINT:
printf("\ninterrupt\n");
break;
case SIGQUIT:
pthread_mutex_lock(&lock);//这里对lock再次加锁,难道不会导致死锁
quitflag = 1;
pthread_mutex_unlock(&lock);
pthread_cond_signal(&wait);
return(0);
default:
printf("unexpected signal %d\n", signo);
exit(1);
}
}
}
int main(void)
{
int err;
sigset_t oldmask;
pthread_t tid;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGQUIT);
if ((err = pthread_sigmask(SIG_BLOCK, &mask, &oldmask)) != 0)
{
printf("SIG_BLOCK error\n");
exit(err);
}
err = pthread_create(&tid, NULL, thr_fn, 0);
if (err != 0)
{
printf("can't create thread\n");
exit(err);
}
pthread_mutex_lock(&lock); //这里已经对lock加过锁了
while(0 == quitflag)
{
pthread_cond_wait(&wait, &lock);
}
pthread_mutex_unlock(&lock);
quitflag = 0;
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
{
printf("SIG_SETMASK error\n");
exit(err);
}
exit(0);
}
疑问已注释在代码里了,就是对lock进行了两次加锁,但没有出现死锁,也没有见到把lock设置为PTHREAD_MUTEX_RECURSIVE 的地方啊,不明白了
[解决办法]
The pthread_mutex_lock() function may fail if:
EDEADLK
The current thread already owns the mutex.