我正在尝试创建一个类运行器(按固定时间频率运行类),它在另一个线程中运行一个类,并且可以从主线程控制(如暂停,恢复,停止)。
因此,我想利用C++11的Functor和其他功能。但是我遇到了一个奇怪的问题,传递到Runner中的Functor的析构函数被调用了两次。
输出:
程序没有输出,且停滞不前。我尝试禁用编译优化,但结果没有变化。有何解释?
如何修复此问题或通过其他方法实现相同功能?应该像std::async / std::thread一样实现这个类吗?
更新为
感谢所有评论和答案。阅读了rvalue后,似乎我从头就误解了rvalue reference的含义。我将尝试其他方法。
此问题的最终解决方案。
因此,我想利用C++11的Functor和其他功能。但是我遇到了一个奇怪的问题,传递到Runner中的Functor的析构函数被调用了两次。
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
class Runner {
public:
typedef function<bool()> fn_t;
Runner(fn_t &&fn) : fn_(move(fn)), thread_(Thread, ref(*this)) {
cout << "Runner" << endl;
}
~Runner() {
cout << "~Runner" << endl;
thread_.join();
}
private:
fn_t fn_;
thread thread_;
static void Thread(Runner &runner) {
while (runner.fn_()) {
cout << "Running" << endl;
this_thread::sleep_for(chrono::milliumseconds(1));
}
}
};
class Fn {
public:
Fn() : count(0) {
cout << "Fn" << endl;
}
~Fn() {
cout << "~Fn" << endl;
}
bool operator()() {
return (++count < 5);
}
private:
int count;
};
int main (int argc, char const* argv[])
{
Fn fn;
Runner runner(move(fn));
return 0;
}
输出:
Fn
Runner
~Fn
~Runner
Running
Running
Running
Running
Running
~Fn
~Fn
若我改变
Fn fn;
Runner runner(move(fn));
to
Runner runner(Fn());
程序没有输出,且停滞不前。我尝试禁用编译优化,但结果没有变化。有何解释?
如何修复此问题或通过其他方法实现相同功能?应该像std::async / std::thread一样实现这个类吗?
更新为
Runner runner(Fn())
此语句被中断,当作函数声明。
Runner runner((Fn()))
解决了这个问题。感谢所有评论和答案。阅读了rvalue后,似乎我从头就误解了rvalue reference的含义。我将尝试其他方法。
此问题的最终解决方案。
#include <iostream>
#include <chrono>
#include <thread>
#include <vector>
using namespace std;
template<typename T, typename... Args>
class Runner {
public:
Runner(Args&&... args) :
t(forward<Args>(args)...),
thread_(Thread, ref(*this)) {
cout << "Runner" << endl;
}
~Runner() {
cout << "~Runner" << endl;
thread_.join();
}
private:
T t;
thread thread_;
static void Thread(Runner &runner) {
while (runner.t()) {
cout << "Running" << endl;
this_thread::sleep_for(chrono::milliseconds(100));
}
}
};
class Fn {
public:
Fn() : count(0) {
cout << "Fn" << endl;
}
~Fn() {
cout << "~Fn" << endl;
}
bool operator()() {
return (count++ < 5);
}
private:
int count;
};
int main (int argc, char const* argv[])
{
//vector<Fn> fns;
//fns.emplace_back(Fn());
Runner<Fn> runner;
return 0;
}
输出:
Fn
Runner
~Runner
Running
Running
Running
Running
Running
~Fn
Fn(Fn const&) { cout << "Fn" << endl; }
你就会看到。 - R. Martinho Fernandes