国际访客建议访问 Primers 编程伙伴 国际版站点 > C 教程 > mtx_unlock 以获得更好的体验。

# C 语言标准库函数 mtx_unlock

在头文件 threads.h 中定义。
/*********************************************
 * @brief 解锁互斥量
 * @param mutex 要加锁的互斥量 ID
 * @return 是否成功
 ********************************************/
int mtx_unlock(mtx_t* mutex);

!subtitle:说明

解锁互斥量。

如果互斥量未被当前线程加锁(未被加锁或被其它线程加锁),则此操作的行为未定义。

!subtitle:参数

  • mutex - 要解锁的互斥量 ID

!subtitle:返回值

  • 成功时返回 thrd_success

  • 失败时返回 thrd_error

# 示例

#include <stdio.h>
#include <threads.h>

// 共享数据和互斥量
struct Args
{
    int n;
    mtx_t mutex;
};


// 线程函数
int func(void* data)
{
    struct Args* args = (struct Args*)data;

    for (int i = 0; i < 10; i++)
    {
        mtx_lock(&args->mutex); // 锁定 mutex
        int value = args->n + 1;
        for (int i = 0; i < 30000; i += 1); // 延长执行时间,提高不加锁时的出错概率
        args->n = value;
        mtx_unlock(&args->mutex); // 解锁 mutex
    }
    
    return 0;
}

int main(void)
{
    struct Args data;
    mtx_init(&data.mutex, mtx_plain); // 创建互斥量

    data.n = 0;

    // 创建线程
    thrd_t th1, th2;
    thrd_create(&th1, func, &data); // 通过参数传递数据和互斥量
    thrd_create(&th2, func, &data);

    // 等待线程结束
    thrd_join(th1, NULL);
    thrd_join(th2, NULL);

    printf("data 的最终值为 %d \n", data.n);

    // 清除互斥量
    mtx_destroy(&data.mutex);
    
    return 0;
}

!subtitle:运行结果

data 的最终值为 20

!subtitle:说明

func 中通过互斥量,在计算 value = data.n + 1 之前加锁,执行 args->n = value 后解锁;保障了步骤的原子性,避免发生错误。

# 推荐阅读

# 参考标准

  • C17 standard (ISO/IEC 9899:2018):

    • 7.26.4.6 The mtx_unlock function (p: 279)

  • C11 standard (ISO/IEC 9899:2011):

    • 7.26.4.6 The mtx_unlock function (p: 382)

本文 更新于: 2025-11-27 09:38:09 创建于: 2025-11-27 09:38:09