【问题标题】:error: no match for call when calling a function by a thread错误:线程调用函数时调用不匹配
【发布时间】:2018-10-31 15:14:41
【问题描述】:

我正在尝试用 C++ 进行生产者/消费者设计,但实际上我被卡住了。 我收到了这个错误

错误:调用不匹配

'(std::thread) (void (&)())' prods[i]>(producer,i);

当我从循环中调用生产者函数时 这是我的主要内容:

 int main(int argc, char* argv[])
{
 
 std::thread prods[argv[1]];
  for (int i = 0; i <= argc;i++){
    prods[i](producer,i);
    } 

  return 0;
 }

这里是我的生产者功能

  void producer(int i){
  std::unique_lock<std::mutex> lock(m);
  std::cout << "(1) produit 20";
  jobs.push(20);
  notified = true;
  cond_var.notify_one();
  done = true;
  
  }

有人知道如何解决这个问题吗?提前致谢。

【问题讨论】:

  • 我刚刚编辑了帖子,生产者线程的数量将作为主要参数给出
  • std::thread prods[argv[1]]; 不是标准 C++(VLA 是编译器扩展),您也不能使用 char* 作为大小。使用std::vector&lt;std::thread&gt;
  • 同样的错误:没有匹配调用:‘(__gnu_cxx::__alloc_traits&lt;std::allocator&lt;std::thread&gt; &gt;::value_type {aka std::thread}) (void (&amp;)())’

标签: c++ multithreading


【解决方案1】:

线程不可调用,需要显式调用线程构造函数来创建线程:

int main(int argc, char* argv[])
{
    const size_t n = 4;
    std::vector< std::thread > prods( n );
    for (int i = 0; i <= n;i++)
    {
        prods[i] = std::thread(producer,i);
    } 
    return 0;
}

我还用std::vector 替换了非标准可变长度数组,并对线程数进行了硬编码,因为您对命令行参数的处理也不正确。

【讨论】:

    【解决方案2】:

    你有几个问题。第一个是

    std::thread prods[argv[1]];
    

    是非标准的。它是一个可变长度数组 (VLA),不是 C++ 标准的一部分。如果你想要一个数组但直到运行时才知道它的大小,那么你应该使用std::vector

    你的第二个问题是

    prods[i](producer,i);
    

    不是为数组的每个元素分配线程的方式。您在语法上尝试做的是在数组中的每个线程上调用函数调用运算符 (operator ())。你需要的是

    prods[i] = std::thread(producer,i);
    

    这实际上会为每个数组元素分配一个线程。

    最后一个问题是

    argv[1]
    

    不能用作数组/容器的大小,因为它是char*。如果它包含要创建的线程数,您需要将其转换为类似std::stoi 的数字。

    也就是说,既然你应该使用std::vecotr,你的实际代码应该是这样的

    int main(int argc, char* argv[])
    {
        std::vector<std::thread> prods;
        prods.reserve(size_you_want)
        for (int i = 0; i < size_you_want; i++){
            prods.push_back(std::thread(producer,i));
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 2016-01-18
      相关资源
      最近更新 更多