读书人

互斥量加锁有关问题有疑问

发布时间: 2013-09-08 15:21:21 作者: rapoo

互斥量加锁问题,有疑问
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.

[解决办法]
上面说的很明白了!
你这样外面还没解锁,你又再加锁可能会加锁不成功的!
达不到你想要枷锁的目的的!

读书人网 >C语言

热点推荐