VS2017中std::shared_timed_mutex.try_lock_for编译问题求助及解决
问题背景
在VS2017开发环境中,尝试调用std::shared_timed_mutex的try_lock_for成员函数设置100毫秒超时锁时,先后遇到两次编译错误:最初的代码写法有误,调整后仍卡在duration类型实例化的问题上,最终通过修正duration的模板参数解决了所有编译错误。
错误根源
最初的代码错误地将std::chrono::milliseconds作为std::chrono::duration的第二个模板参数,但std::chrono::duration的第二个参数需要的是时间周期比例(比如std::milli),而非已经封装好的duration类型(std::chrono::milliseconds本质是std::chrono::duration<int, std::milli>的别名)。
修正后的完整代码
#include <chrono> // 引入std::chrono相关类型 #include <shared_mutex> // 引入std::shared_timed_mutex #include <iostream> // 引入std::cerr用于输出错误信息 static std::shared_timed_mutex SHMutex; void testfunc() { // 正确定义毫秒级duration类型:使用std::milli作为周期比例,_int64作为计数类型 using duration2 = std::chrono::duration<_int64, std::milli>; // 原错误写法:using duration2 = std::chrono::duration<_int64, std::chrono::milliseconds>; const duration2 dur(100); if (!SHMutex.try_lock_for(dur)) std::cerr << "SHMutex加锁失败(超时100毫秒)" << '\n'; }
关键说明
std::milli是标准库定义的比例类型,代表1/1000秒,是std::chrono::duration周期参数的正确选择。_int64是VS环境下的64位整数类型,也可以替换为标准的std::int64_t(需额外引入<cstdint>头文件)以提升代码可移植性。try_lock_for接收的参数必须是符合std::chrono::duration规范的类型,错误的模板参数会导致编译器无法匹配函数重载,进而抛出实例化错误。
内容的提问来源于stack exchange,提问作者SJHowe
相关产品推荐
相关产品推荐

