首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-09-08 
互斥量加锁问题,有疑问UNIX环境高级编程程序清单12-6#include stdio.h#include stdlib.h#include uni

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

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

热点排行