我想创建一个事件循环类,它将在它自己的线程上运行,支持将任务添加为 std::functions
并执行它们。
为此,我从这里使用 SafeQueue:https://stackoverflow.com/a/16075550/1069662
class EventLoop
{
public:
typedef std::function<void()> Task;
EventLoop(){ stop=false; }
void add_task(Task t) { queue.enqueue(t); }
void start();
void stop() { stop = true; }
private:
SafeQueue<Task> queue;
bool stop;
};
void EventLoop::start()
{
while (!stop) {
Task t = queue.dequeue(); // Blocking call
if (!stop) {
t();
}
}
cout << "Exit Loop";
}
然后,你会像这样使用它:
EventLoop loop;
std::thread t(&EventLoop::start, &loop);
loop.add_task(myTask);
// do smth else
loop.stop();
t.join();
我的问题是:如何优雅地停止线程? 这里stop因为阻塞队列调用无法退出循环。
最佳答案
排队“毒丸”停止任务。这会取消阻塞队列等待并直接请求线程清理并退出或允许使用者线程检查“停止” bool 值。
假设您需要在应用程序终止之前完全停止线程/任务。如果我能逃脱惩罚,我通常会尽量不这样做。
关于具有线程安全队列的 C++11 事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26441912/