Linux 多线程编程:互斥锁 (Mutex) —— 给共享资源加上“安全锁” - 详解
各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb
在上一篇博客中,我们见识了多线程“裸奔”(无同步机制)时导致的银行账户错误和打印乱码。为了解决这些问题,我们需要引入一种机制,保证同一时刻只有一个线程能访问共享资源。
这个机制就是互斥量(Mutex)。你可以把它想象成洗手间门上的锁:“有人占用,闲人免进”。
一、 互斥锁的“使用说明书”
互斥锁本质上是一个结构体 pthread_mutex_t,但在逻辑上,我们可以把它看作一个初值为 1 的整数:
- 1 (Unlocked):锁是空闲的,可以进。
- 0 (Locked):锁被占用了,必须排队等待。
核心函数五件套
所有函数成功都返回 0,失败返回错误号。
- 定义锁:
pthread_mutex_t mutex;(通常定义为全局变量) - 初始化:
pthread_mutex_init(&mutex, NULL); - 加锁 (阻塞):
pthread_mutex_lock(&mutex);- 若是锁可用 (1),减 1 变为 0,线程继续执行。
- 若是锁被占 (0),线程阻塞(挂起睡觉),直到锁被释放。
- 解锁:
pthread_mutex_unlock(&mutex);- 将锁的值加 1 变为 1,并唤醒阻塞在该锁上的线程。
- 销毁:
pthread_mutex_destroy(&mutex);
二、 代码实战:拯救“打印乱码”
我们重写之前的“打印机”案例,这次加上互斥锁,确保 HELLO 和 world 能够完整输出,互不打断。
1. 代码示例 (mutex_print_fix.c)
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
// 1. 定义全局互斥锁
pthread_mutex_t mutex;
void printer(const char *str) {
// 3. 进入临界区前加锁
// 拿到锁后,其他线程如果也想调 printer,就会卡在这一行等待
pthread_mutex_lock(&mutex);
while (*str != '\0') {
putchar(*str);
fflush(stdout);
usleep(1000); // 即使在这里放弃CPU,因为持有锁,其他线程也进不来
str++;
}
printf("\n");
// 4. 离开临界区后解锁
pthread_mutex_unlock(&mutex)

浙公网安备 33010602011771号