【发布时间】:2015-07-09 02:08:45
【问题描述】:
我有一些作业,但我很难理解(可能)将参数传递给 std::thread 构造函数的工作原理。
假设以下代码(我删除了不需要的部分)
template<typename T, typename Task>
class Scheduler
{
private:
typedef std::unordered_map<std::size_t, T> Results;
class Solver
{
public:
Solver(Task&& task) : m_thread(&Solver::thread_function, std::move(task))
{
m_thread.detach();
}
Solver(Solver&& solver) = default; // required for vector::emplace_back
~Solver() = default;
private:
void thread_function(Task&& task)
{
task();
}
std::thread m_thread;
};
public:
Scheduler() = default;
~Scheduler() = default;
void add_task(Task&& task)
{
m_solvers.emplace_back(std::move(task));
}
private:
std::vector<Solver> m_solvers;
};
template<typename T>
struct Ftor
{
explicit Ftor(const T& t) : data(t) { }
T operator()() { std::cout << "Computed" << std::endl; return data; }
T data;
};
int main()
{
Scheduler<int, Ftor<int>> scheduler_ftor;
Scheduler<int, std::function<int(void)>> scheduler_lambda;
Ftor<int> s(5);
scheduler_ftor.add_task(std::move(s));
scheduler_lambda.add_task([](){ std::cout << "Computed" << std::endl; return 1; });
}
为什么它不编译? MVS2015在抱怨
functional(1195): error C2064: term 不计算为带 1 个参数的函数 功能(1195):注意:类没有定义一个'operator()'或用户定义的转换运算符到一个指向函数的指针或引用到函数,需要适当数量的参数
注意:在编译类模板成员函数'Scheduler>::Solver::Solver(Task &&)'时
虽然 G++ 4.9.2
功能:在 'struct std::_Bind_simple<:_mem_fn ftor> >::Solver::*)(Ftor
&&)>(Ftor )>':
'void Scheduler::add_task(Task&&) [with T = int;任务 = Ftor ]' functional:1665:61: error: no type named 'type' in 'class std::result_of<:_mem_fn ftor> >::Solver::*)(Ftor
&&)>(Ftor )>' typedef typename result_of<_callable>::type result_type;
我认为 std::moving 到 std::thread 存在一些问题。
【问题讨论】:
-
这个问题最小吗?看起来有问题的错误可能是由更短和更简单的代码库产生的。检查每一行代码并尝试删除它。 Here is an example of a far more minimal example that generates the same error 没有噪音。我只是看着每一行,想“我可以删除这个吗”,我可以,我做到了(也许更改其他地方的代码以匹配),并重新编译以确保错误仍然发生。 -1。包括“有抱负的”计划,但也包括最少的代码:噪音会阻碍。
标签: multithreading c++11