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); }
解决方案
-
第一种方案就是控制外部调用,保证在调用关闭接口之前,没有任何其他线程阻塞在资源获取接口上。文章来源:https://www.toymoban.com/news/detail-739269.html
-
第二种方案就是使用静态初始化,代码如下:文章来源地址https://www.toymoban.com/news/detail-739269.html
#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); }
到了这里,关于pthread 变量静态初始化 避免使用被销毁过的变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!