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

# C 语言标准库函数 mtx_trylock

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

!subtitle:说明

尝试锁定互斥量,立即返回而不产生阻塞。

这个函数可能会虚假的失败,即互斥量并没有被加锁,却失败返回 thrd_busy;这是由于内存(缓存)可见性延迟、硬件优化、内存屏障等原因导致的正常现象。

!subtitle:参数

  • mutex - 要加锁的互斥量 ID

!subtitle:返回值

  • 成功时返回 thrd_success

  • 互斥量已被锁定(或虚假的失败)时返回 thrd_busy

  • 其它失败返回 thrd_error

# 示例

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

// 线程函数
int func(void* data)
{
    mtx_t* mutex = (mtx_t*)data; // 通过参数传递互斥量

    printf("开始时间: %s", ctime(&(time_t){time(NULL)}));

    // 加锁
    if (mtx_trylock(mutex) == thrd_success)
    {
        printf("加锁成功\n");
    }
    else
    {
        printf("加锁失败\n");
    }

    printf("结束时间: %s", ctime(&(time_t){time(NULL)}));
    
    return 0;
}

int main(void)
{
    // 创建支持超时的互斥量
    mtx_t mutex;
    mtx_init(&mutex, mtx_timed); 

    // 加锁
    mtx_lock(&mutex);

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

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

    // 加锁
    mtx_unlock(&mutex);

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

!subtitle:运行结果

开始时间: Sun Aug 24 14:17:13 2025
加锁失败
结束时间: Sun Aug 24 14:17:13 2025

!subtitle:说明

示例中,子线程函数调用 mtx_trylock 尝试加锁。

主线程在创建子线程前已经对互斥量加锁,并且始终没有解锁,因此子线程无法成功加锁,立即返回失败。

# 推荐阅读

# 参考标准

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

    • 7.26.4.5 The mtx_trylock function (p: 278-279)

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

    • 7.26.4.5 The mtx_trylock function (p: 382)

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