[英]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.