lzy804032511的个人空间 https://bbs.21ic.com/?680659 [收藏] [复制] [RSS]

日志

linux 如何在多线程互斥中使用PTHREAD_MUTEX_RECURSIVE避免死锁

已有 395 次阅读2016-1-15 16:03 |个人分类:linux应用|系统分类:嵌入式系统| pthread_mutex

//Avoid some times cann't include pthread_mutexattr_settype
#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_mutex_t lock;
pthread_mutexattr_t attr;
pthread_t child;
char Buf[64];

void *childpthread(void *arg)
{
    int j = 0;
    int i = 0;
    int ret;

    while(1)
    {
        ret = pthread_mutex_lock(&lock);
        if(ret != 0)
        {
            printf("child lock error\n");
        }

        for(i = 0;i < sizeof(Buf);i++)
        {
            ret = pthread_mutex_lock(&lock);
            if(ret != 0)
            {
                printf("child relock error\n");
            }

            Buf[i] = '0' + (i%10);
            usleep(5000);

            ret = pthread_mutex_unlock(&lock);
            if(ret != 0)
            {
                printf("child reunlock error\n");
            }
        }

        printf("child Buf %s\n", Buf);

        ret = pthread_mutex_unlock(&lock);
        if(ret != 0)
        {
            printf("child unlock error\n");
        }

        j++;
        if(j > 10)
        {
            j = 0;
            sleep(10);
        }
    }
}

int main()
{
    int i = 0;
    int j = 0;
    int ret;

    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(&lock, &attr);

    pthread_create(&child, NULL, childpthread, NULL);

    while(1)
    {
        ret = pthread_mutex_lock(&lock);
        if(ret != 0)
        {
            printf("main lock error\n");
        }

        for(i = 0;i < sizeof(Buf);i++)
        {
            Buf[i] = 'a' + (i%10);
            usleep(5000);
        }

        printf("main Buf %s\n", Buf);

        ret = pthread_mutex_unlock(&lock);
        if(ret != 0)
        {
            printf("main unlock error\n");
        }
        j++;
        if(j > 10)
        {
            j = 0;
            sleep(10);
        }
    }

    return 0;
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)