Linux 多线程编程:互斥锁 (Mutex) —— 给共享资源加上“安全锁” - 详解

各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb

在上一篇博客中,我们见识了多线程“裸奔”(无同步机制)时导致的银行账户错误和打印乱码。为了解决这些问题,我们需要引入一种机制,保证同一时刻只有一个线程能访问共享资源。

这个机制就是互斥量(Mutex)。你可以把它想象成洗手间门上的锁:“有人占用,闲人免进”


一、 互斥锁的“使用说明书”

互斥锁本质上是一个结构体 pthread_mutex_t,但在逻辑上,我们可以把它看作一个初值为 1 的整数:

  • 1 (Unlocked):锁是空闲的,可以进。
  • 0 (Locked):锁被占用了,必须排队等待。

核心函数五件套

所有函数成功都返回 0,失败返回错误号。

  1. 定义锁pthread_mutex_t mutex; (通常定义为全局变量)
  2. 初始化pthread_mutex_init(&mutex, NULL);
  3. 加锁 (阻塞)pthread_mutex_lock(&mutex);
    • 若是锁可用 (1),减 1 变为 0,线程继续执行。
    • 若是锁被占 (0),线程阻塞(挂起睡觉),直到锁被释放。
  4. 解锁pthread_mutex_unlock(&mutex);
    • 将锁的值加 1 变为 1,并唤醒阻塞在该锁上的线程。
  5. 销毁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)
posted @ 2026-01-31 09:57  yangykaifa  阅读(5)  评论(0)    收藏  举报