具有线程安全队列的 C++11 事件循环

标签 c++ multithreading c++11

我想创建一个事件循环类,它将在它自己的线程上运行,支持将任务添加为 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/

相关文章:

c++ - 打开 mp 3 for 循环减少

c++ - g++ 和运算符 << 在评估期间更改值时会产生意外结果

android - 只有创建 View 层次结构的原始线程才能触摸其 View 。安卓

c - C中的线程本地数据

c++ - 如何打印 C++ 应用程序中所有线程的列表?

c++ - 我可以避免所有这些多次尝试/捕获吗

C++ 不允许我在初始化列表中使用其他构造函数

c++ - Tesseract OCR 的置信度值

Java List.add() 方法添加一个可修改的对象

c++ - 返回简历 :Mat pointer to main function