pthread 变量静态初始化 避免使用被销毁过的变量

72 阅读1分钟

pthread 变量静态初始化

  • 互斥锁:pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
  • 读写锁:pthread_rwlock_t g_rwlock = PTHREAD_RWLOCK_INITIALIZER;
  • 条件变量:pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;

适用场景

  • 以互斥锁为例,当持有互斥锁的线程,需要进行互斥锁的销毁工作时,无法确保当前没有任何其他线程会在锁销毁之后,仍使用该锁。

场景代码

  • 模块 xx 对外提供3个 api,分别为打开,关闭,资源获取,资源获取接口以及关闭接口可能会被外部不同的线程调用,因此需要使用互斥锁保护,如果关闭接口先于资源获取接口获得互斥锁,且关闭接口中执行了互斥锁的销毁,则会导致阻塞在资源获取接口上的线程使用被销毁过的互斥锁。

  • 代码如下:

    #include <pthread.h>
    
    pthread_mutex_t mutex;
    
    int xx_init()
    {
        pthread_mutex_init(&mutex, NULL);
        // ...
    }
    
    int xx_getres()
    {
        pthread_mutex_lock(&mutex);
        // ...
        pthread_mutex_unlock(&mutex);
    }
    
    int xx_close()
    {
        pthread_mutex_lock(&mutex);
        // ...
        pthread_mutex_unlock(&mutex);
        pthread_mutex_destroy(&mutex);
    }
    

解决方案

  • 第一种方案就是控制外部调用,保证在调用关闭接口之前,没有任何其他线程阻塞在资源获取接口上。

  • 第二种方案就是使用静态初始化,代码如下:

    #include <pthread.h>
    
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    
    int xx_init()
    {
        // ...
    }
    
    int xx_getres()
    {
        pthread_mutex_lock(&mutex);
        // ...
        pthread_mutex_unlock(&mutex);
    }
    
    int xx_close()
    {
        pthread_mutex_lock(&mutex);
        // ...
        pthread_mutex_unlock(&mutex);
    }