递归锁

 应用场景:

 

示例:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 同一个线程可以多次获取同一个递归锁,不会产生死锁。
int counter = 0;

pthread_mutex_t g_mutex;    // = PTHREAD_MUTEX_INITIALIZER;

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 同一个线程可以多次获取同一个递归锁,不会产生死锁。
int counter = 0;

pthread_mutex_t g_mutex;    // = PTHREAD_MUTEX_INITIALIZER;

void *doit(void *arg)
{   
    int i, val; 
    for (i = 0; i < 5000; i++) {
        pthread_mutex_lock(&g_mutex);
        pthread_mutex_lock(&g_mutex);
        
        val = counter;
        printf("%x: %d\n", pthread_self(), val + 1);
        counter = val + 1;
        
        pthread_mutex_unlock(&g_mutex);
        pthread_mutex_unlock(&g_mutex);
    }
}

int main(int argc, char *argv[])
{
//      create recursive attribute 
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);

    //set recursive attribute
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);

    pthread_mutex_init(&g_mutex, &attr);

    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, doit, NULL);
    pthread_create(&tid2, NULL, doit, NULL);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    pthread_mutex_destroy(&g_mutex);

    //destroy recursive attribute
    pthread_mutexattr_destroy(&attr);

    return 0;
}

 

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
//  如果一个线程多次获取同一个非递归锁,则会产生死锁。
int counter = 0;

pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;

void *doit(void *arg)
{
    int i, val;
    for (i = 0; i < 5000; i++) {
        pthread_mutex_lock(&g_mutex);
        //pthread_mutex_lock(&g_mutex); //非递归锁加两次就会产生死锁。

        val = counter;
        printf("%x: %d\n", pthread_self(), val + 1); 
        counter = val + 1;

        pthread_mutex_unlock(&g_mutex);
        //pthread_mutex_unlock(&g_mutex);
    }   
}

int main(int argc, char *argv[])
{
    pthread_t tid1, tid2;

    pthread_create(&tid1, NULL, doit, NULL);
    pthread_create(&tid2, NULL, doit, NULL);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    return 0;
}

 

posted @ 2019-10-12 20:46  PKICA  阅读(11)  评论(0)    收藏  举报