繁体   English   中英

使用 C++ std::vector 作为线程中的队列

[英]Using a C++ std::vector as a queue in a thread

我想通过异步 web 请求处理程序将项目添加到一个线程中的队列中:

void handleRequest(item) {
    toProcess.push_back(item);
}

有一个后台线程不断处理这些队列项,如下所示:

while(true) {
   for(auto item : toProcess) { doSomething(item); }
   toProcess.clear();
}

显然这不是线程安全的......您可以在 for 循环完成时将一个项目添加到 toProcess ,从而在不处理的情况下将其清除。 编写这样的程序的最佳 model 是什么?

我将使用std::atomic<T>::wait这是一个C++20特性,但是也有一种方法可以使用条件变量,并且它们自C++11以来就存在。

包括<atomic><mutex>

您将需要一个成员 atomic_bool。
std::atomic_bool RequestPassed = false;
和一个成员互斥锁
std::mutex RequestHandleMutex;

您的 handleRequest function 将变为

void handleRequest(item) {
    std::lock_guard<std::mutex> lg(RequestHandleMutex)
    toProcess.push_back(item);
    RequestPassed.store(true);
    RequestPassed.notify_all();
}

你的循环就是这个

while(true) {
    RequestPassed.wait(false);
    std::lock_guard<std::mutex> lg(RequestHandleMutex)
    /* handle latest item passed */
    RequestPassed.store(false);
}

这样,while 线程等待而不是不断迭代(节省 CPU 功率和电池)。 如果您随后使用handleRequest ,则会通知 atomic_bool 停止等待,处理请求(互斥锁被锁定,因此在发生这种情况时不会出现新请求), RequestPassed 重置为 false,并且线程等待下一个请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM