我想创建一个事件循环类,它可以在自己的线程上运行,支持添加std::functions作为任务并执行它们。为此,我使用了这里的SafeQueue: https://dev59.com/tWUp5IYBdhLWcg3wbnMS#16075550
然后,您可以像这样使用它:
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();
我的问题是:如何优雅地停止线程? 在这种情况下,由于阻塞队列的调用,无法使用停止来退出循环。
bool SafeQueue<T>::try_dequeue(Task& out, std::chrono::milliseconds timeout);
的函数或者类? - Mooing Duck