【问题标题】:how to pass <std::function<void(int)>> paramater in c++ [closed]如何在 C++ 中传递 <std::function<void(int)>> 参数 [关闭]
【发布时间】:2018-11-18 20:40:18
【问题描述】:

我正在尝试在 C++ 中执行线程池设计模式,但我坚持传递任务函数参数以便将其推送到列表中 这是我的代码

  std::list<std::function<void(int)>> work_queue; 

我的推送功能

 void pushTask(std::function<void(int)> func , int a) 
{ 
std::unique_lock<std::mutex> lck(wq_mutex);
work_queue.push_back(std::function<void(int)>(func),a));
 }   

这里是我的主要功能与任务功能

void calcul(int a){
std::cout << a << "\n";
}

int main(){
ThreadPool th(10);
th.pushTask(std::bind(&calcule,4));
return 0;

}

我在这一行得到一个错误

   work_queue.push_back(std::function<void(int)>(func),a));

谁能指出问题所在?

【问题讨论】:

  • 避免使用那种演员表,应该是work_queue.push_back(func, a);。在您的示例中,括号不匹配。如果您仍然遇到问题,请发布MCVE
  • 当编译器给你一个错误时,仔细阅读它是很重要的。如果您不理解它并想发布有关它的整个 Stack Overflow 问题,您应该做的最低限度是在代码中包含错误消息。
  • 错误是什么?我想我算了一个额外的),是这个问题吗?
  • 我将错误行更改为 work_queue.push_back(func,a);我仍然收到错误:没有匹配的功能错误
  • 请注意std::bind(&amp;calcule,4)的结果不能隐式转换为std::function&lt;void(int)&gt;,因为您显式绑定了参数4——它的“有效”类型是std::function&lt;void()&gt;

标签: c++ multithreading std-function


【解决方案1】:

你做错了。

std::list<std::function<void()>> work_queue; // you do not need int here

void pushTask(std::function<void()> func) // so here it is also obsolete
{ 
    std::unique_lock<std::mutex> lck(wq_mutex);
    work_queue.push_back(std::move(func));
}

// now this will be ok
th.pushTask(std::bind(&calcule,4));
// but since this is C++11 lambda is preferred 
th.pushTask([]() { calcule(4); } );

【讨论】:

  • 它有效,谢谢,请问 std::move 角色是什么?
  • 阅读 C++11 中的移动原理图。
  • 无论如何,因为看起来你是一个新手,我建议你避免使用线程,直到你大大提高你的技能。我知道线程看起来非常花哨和时尚,但它们很难掌握。线程的最大问题使用不是确定性的。所以你可以认为它创造了一个很好的软件,因为它可以在你的机器上运行,但是有些机器上总是会发生错误。
猜你喜欢
  • 2018-04-20
  • 2019-06-05
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 2012-11-10
相关资源
最近更新 更多