std::thread传入类成员函数VS编译报错跨编译器兼容方案
问题根因
非静态类成员函数作为std::thread入口的写法有明确的C++标准语法要求,你之前的两种写法均不符合标准规范:
- 裸写
threadFunction作为参数:成员函数在类内部上下文不会自动隐式转换为成员函数指针,MSVC严格遵循标准抛出C3867错误,GCC是开启了非标准扩展才容错通过,属于不可靠写法 - 写
&threadFunction作为参数:缺少类作用域限定,编译器会尝试查找全局作用域下的普通函数threadFunction取地址,找不到对应符号就会报非法操作错误
跨编译器兼容的正确实现
传递非静态成员函数给std::thread时,必须显式指定带类作用域的成员函数指针,紧跟类实例指针作为调用对象,修改StartThread函数实现即可:
void Foo::StartThread() { // 标准写法,所有支持C++11及以上的编译器均兼容 foo_thread = std::thread(&Foo::threadFunction, this); }
该写法完全符合C++标准要求,在GCC、Clang、MSVC全版本编译器下均可正常编译运行,不存在跨IDE、跨编译环境的兼容问题。
补充说明:你代码中std::atomic<bool>的初始化写法ATOMIC_VAR_INIT(false)在C++20标准中已被标记为废弃,建议直接使用列表初始化写法std::atomic<bool> monitoring{false};,不影响当前线程相关错误的修复。
内容的提问来源于stack exchange,提问作者user16541120
相关产品推荐
相关产品推荐

