C++多线程使用mutex时触发C2672、C2893编译错误求助
错误成因
这两个编译错误和互斥量some_mutex的使用无关,核心问题是std::thread构造时传入的线程函数与实际提供的参数不匹配,导致内部用于执行线程函数的std::invoke找不到匹配重载、模板特化失败。
代码里定义的两个线程函数都要求必须传入1个int类型入参:
add_to_list需要接收int new_value作为待插入列表的数值list_contains需要接收int value_to_find作为待查找的目标值
但构造t1、t2两个线程对象时,仅传入了函数名,没有给这两个函数提供对应的int类型实参,std::invoke无法生成无参调用这两个需要入参的函数的实例,就会触发C2672、C2893报错。
VS官方文档提到的"要让模板参数成员在求值位置可访问",对应这个场景的实际含义是:std::invoke在编译期推导可调用对象的调用形式时,需要拿到和函数签名匹配的参数列表才能完成模板特化,缺参会直接导致推导失败。
修复方案
构造std::thread对象时,在函数名后按顺序传入函数要求的实际参数即可,修复后的main函数代码如下:
int main() { using std::thread; // 第二个参数为传入add_to_list的int类型实参,示例传入数值5 thread t1(add_to_list, 5); // 第二个参数为传入list_contains的int类型实参,示例传入查找值5 thread t2(list_contains, 5); t1.join(); t2.join(); return 0; }
补充说明:如果后续需要给线程函数传入引用类型的参数,需要使用std::ref包装对应实参,否则std::thread会默认拷贝参数值,同样会触发std::invoke的参数匹配错误。
内容的提问来源于stack exchange,提问作者Victor Hut
相关产品推荐
相关产品推荐

