#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 后解锁;保障了步骤的原子性,避免发生错误。
#推荐阅读
- C 语言标准库函数 mtx_unlock
- C 语言标准库函数 mtx_trylock
- C 语言标准库函数 mtx_timedlock
- C 语言标准库函数 mtx_init
- C 语言标准库函数 mtx_destroy
- mtx_lock - cppreference
#参考标准
- 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)