这是我第一次尝试使用boost :: threads,我有一个愚蠢的问题。
我调用boost:thread来使用我的一个模板类函数。但是在阅读this tutorial之后,它会说我构建了一个operator()()
。
以下代码是否可以正常工作?
template <class S>
class SarsaL : public Task<S,Policy>, protected Method
{
protected:
...
void updateEpsilons(S* avoid);
void step();
...
public:
...
void operator()();
...
};
template <class S>
void SarsaL<S>::operator()()
{
updateEpsilons();
}
template <class S>
void SarsaL<S>::step()
{
S* now_state = Task<S,Policy>::checkIfAdd();
...
...
boost::thread workerThread(&SarsaL<S>::updateEpsilons, this, now_state);
...
...
workerThread.join();
}
我问的原因是因为我在没有参数的情况下在运算符中调用updateEpsilons()
,但在创建线程时我发送参数now_state
。这会起作用还是不论证?代码编译和执行没有错误,我只是感到困惑。
答案 0 :(得分:2)
如果在要执行的对象上提供方法(在本例中为operator()()
),则不必使用updateEpsilons
。显然,此operator()()
不正确,因为它没有使用参数调用相应的updateEpsilons
方法。
请注意,在本教程中,创建了新线程,只提供了一个类的实例,而没有方法。在这种情况下,类必须实现operator()()
,这将是线程代码的调用。