当前位置: 首页 > news >正文

『 C++ 』错误使用std::mutex引发的error C2039: “try_lock_until“: 不是 “std::mutex“ 的成员

错误原因分析与解决方法

错误原因

错误C2039:“try_lock_until”:不是"std::mutex"的成员的根本原因是std::mutex类型不支持try_lock_until方法。try_lock_untilstd::timed_mutexstd::recursive_timed_mutex的成员函数,而不是std::mutex的成员函数。因此,当尝试在std::mutex上调用try_lock_until时,编译器会报错,提示找不到该成员函数。

错误代码

以下是原始代码示例,展示了错误的使用方式:

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex mtx;

void worker() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << "Worker thread locked the mutex." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Worker thread unlocked the mutex." << std::endl;
}

int main() {
    std::thread t(worker);

    std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
    auto timeout = std::chrono::steady_clock::now() + std::chrono::seconds(1);

    if (lock.try_lock_until(timeout)) { // 错误:std::mutex 不支持 try_lock_until
        std::cout << "Main thread locked the mutex." << std::endl;
        lock.unlock();
    }
    else {
        std::cout << "Main thread failed to lock the mutex within the timeout." << std::endl;
    }

    t.join();
    return 0;
}

错误提示

编译时会报错:

error C2039: "try_lock_until": 不是 "std::mutex" 的成员
message : 参见“std::mutex”的声明
message : 查看对正在编译的函数模板实例化“bool std::unique_lock<std::mutex>::try_lock_until<std::chrono::steady_clock,std::chrono::nanoseconds>(const std::chrono::time_point<std::chrono::steady_clock,std::chrono::nanoseconds> &)”的引用
message : 请参阅 "main" 中对 "std::unique_lock<std::mutex>::try_lock_until" 的第一个引用

正确代码

要解决此问题,需要将std::mutex替换为std::timed_mutex,因为std::timed_mutex支持try_lock_until方法。以下是修改后的正确代码:

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::timed_mutex mtx;
bool ready = false;

void worker() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::lock_guard<std::timed_mutex> lock(mtx); // 使用 std::timed_mutex
    std::cout << "Worker thread locked the mutex." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(2));
    ready = true;
    std::cout << "Worker thread unlocked the mutex." << std::endl;
}

int main() {
    std::thread t(worker);

    std::unique_lock<std::timed_mutex> lock(mtx, std::defer_lock); // 使用 std::timed_mutex
    auto timeout = std::chrono::system_clock::now() + std::chrono::seconds(1);

    if (lock.try_lock_until(timeout)) { // 正确:std::timed_mutex 支持 try_lock_until
        std::cout << "Main thread locked the mutex." << std::endl;
        lock.unlock();
    }
    else {
        std::cout << "Main thread failed to lock the mutex within the timeout." << std::endl;
    }

    t.join();
    return 0;
}

注意事项

• 选择合适的互斥锁类型

• 如果需要支持超时锁定功能(如try_lock_untiltry_lock_for),应使用std::timed_mutexstd::recursive_timed_mutex

• 如果不需要超时功能,可以继续使用std::mutexstd::recursive_mutex

• 确保编译器支持

try_lock_until是 C++14 标准引入的功能。确保你的编译器支持 C++14 或更高版本。在 Visual Studio 2022 中,默认支持 C++14。

• 头文件包含

• 确保包含<mutex><chrono>头文件:

     #include <mutex>
     #include <chrono>
     ```


通过以上修改,可以解决编译错误并正确实现超时锁定功能。


---


希望这个润色后的版本对你有帮助!

相关文章:

  • vue3:十一、主页面布局(左侧菜单折叠展开设置)
  • vulnhub靶场之【hack-me-please靶机】
  • 微前端框架深度对比与技术实现剖析
  • Cursor的五种高级用法
  • 数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记
  • 权限维持—Linux系统Rootkit后门
  • 云原生之开源遥测框架OpenTelemetry(在 Gin 框架中使用 OpenTelemetry 进行分布式追踪和监控)
  • 软考通关利器:中级软件设计师结构化开发核心考点
  • UniRel论文复现过程中的问题解决办法(全)
  • 【C语言】字符串函数详解
  • AtCoder Beginner Contest 398(ABCDEF)
  • MySQL密码修改的全部方式一篇详解
  • 使用brower use AI 代理自动控制浏览器完成任务
  •  UNIX网络编程笔记:TCP客户/服务器程序示例
  • 基于springboot的房屋租赁系统(028)
  • 电机控制常见面试问题(十七)
  • JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)
  • 『uniapp』简单文本复制文字 富文本内容复制文字(详细图文注释)
  • GOC按钮点击器
  • 【JavaEE进阶】部署Web项目到Linux服务器
  • 许峰已任江苏省南京市副市长
  • 69岁朱自强被查,曾任南京地铁总经理
  • 直播电商行业代表呼吁:携手并肩伸出援手助力外贸企业攻坚克难
  • 民调显示特朗普执政百日支持率为80年来美历任总统最低
  • 加拿大温哥华一车辆冲撞人群,造成多人伤亡
  • 特朗普将举行集会庆祝重返白宫执政百日,美媒:时机不当