2150

11 分钟

#C 语言标准库函数 mtx_lock

/********************************************* * @brief 锁定互斥量 * @param mutex 要加锁的互斥量 ID * @return 是否成功 ********************************************/ int mtx_lock(mtx_t* mutex);

说明

阻塞当前线程,直到锁定互斥量。

对于非递归的互斥量,如果已经被当前线程锁定,则此操作的行为未定义。

参数

  • mutex - 要加锁的互斥量 ID

返回值

  • 成功时返回 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; }

运行结果

data 的最终值为 20

说明

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

#推荐阅读

#参考标准

  • C17 standard (ISO/IEC 9899:2018):
    • 7.26.4.3 The mtx_lock function (p: 278)
  • C11 standard (ISO/IEC 9899:2011):
    • 7.26.4.3 The mtx_lock function (p: 381)

创建于 2025/8/24

更新于 2025/10/25