You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:15:46