当我们通过 pthread_mutex_init() 初始化互斥量后,接下来就是上锁(pthread_mutex_lock)和解锁(pthread_mutex_unlock)操作了 。
2.3 上锁 & 解锁
上锁解锁函数原型pthread_mutex_lock(pthread_mutex_t *mutex);int pthread_mutex_unlock(pthread_mutex_t *mutex);头 文 件#include <pthread.h>#include <pthread.h>返 回 值成功返回 0,失败返回错误码成功返回 0,失败返回错误码让我们来梳理一下互斥量的使用流程:
- 通过 pthread_mutex_init() 购买一把锁
- 通过 pthread_mutex_lock() 加锁
- 通过 pthread_mutex_unlock() 解锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 静态初始化锁void *func1(void *arg){ pthread_mutex_lock(&mutex); puts("线程 th1 抢到锁"); puts("线程 th1 开始执行 giNum++"); int i; for (i = 1; i <= MAX; i++) { giNum++; } pthread_mutex_unlock(&mutex); return NULL;}void *func2(void *arg){ pthread_mutex_lock(&mutex); puts("线程 th2 抢到锁"); puts("开始执行 giNum++"); int i; for (i = 1; i <= MAX; i++) { giNum *= 2; } pthread_mutex_unlock(&mutex); return NULL;}此时,再次运行程序,你会发现不管运行多少次,结果都是 \(giNum = 2\times10^7\) 。
下面我们对上面的代码做个简单的修改,将 func2 中的giNum++操作修改为giNum *= 2,
三、条件变量3.1 为什么要使用条件变量如果没有条件变量,那么我们等待一个条件满足则会是下面这样的模型:
文章插图
- 首先加锁进入临界区去查看条件是否满足,不满足则解锁离开临界区,睡眠一段时间再继续循环判断 。
这种模型既费时又开销大 , 所以条件变量的产生 , 正是为了不循环加锁解锁,并且第一时间收到条件满足的通知 。
3.2 条件变量函数介绍3.2.1 pthread_cond_t条件变量使用特定的数据类型:pthread_cond_t 。使用条件变量前要先初始化,初始化又分为静态初始化和动态初始化:
- 静态初始化:pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- 动态初始化:pthread_cond_init(&cond, NULL);
静态初始化的条件变量只能拥有默认的条件变量属性,不能设置其他条件变量属性 。3.2.2 pthread_cond_init函数原型:int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
头 文 件:#include <pthread.h>
功 能:对条件变量初始化
返 回 值:成功返回 0 , 失败返回错误码
参数介绍:
- cond:需要初始化的条件变量
- attr:初始化时条件变量的属性,一般置为 NULL , 表示使用默认属性
头 文 件:#include <pthread.h>
功 能:对条件变量反初始化(在条件变量释放内存之前)
返 回 值:成功返回 0,失败返回错误码
参数介绍:需要反初始化的条件变量
备注:此函数只是反初始化互斥量,并没有释放内存空间 。如果互斥量是通过 malloc 等函数申请的,那么需要在 free 掉互斥量之前调用 pthread_mutex_destroy 函数
推荐阅读
- VLQ & Base64 VLQ 编码方式的原理及代码实现
- MYSQL-->InnoDB引擎底层原理
- StampedLock:一个并发编程中非常重要的票据锁
- Longchamp龙骧饺子包
- <三>从编译器角度理解C++代码编译和链接原理
- <一>关于进程虚拟地址空间区域内存划分和布局
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
- 🔥支持 Java 19 的轻量级应用开发框架,Solon v1.10.4 发布
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
- XXI Open Cup, Grand Prix of Belarus 2020-2021 Winter Petrozavodsk Camp, Belarusian SU Contest 题解