jjzjj

c++ - 在所有 std::futures 完成之前从函数返回是否安全?

我有这样的代码:intfunction(){std::vector>futures;for(constauto&elem:elements){futures.push_back(std::async(&MyClass::foo,myClass,elem);}for(auto&f:futures){constintx=f.get();if(x!=0)returnx;}}当有未完成的异步调用时,我可以从函数中返回吗?我只对一个非零值感兴趣。我应该等到所有异步调用完成吗?这段代码安全吗? 最佳答案 std::future的析构函数(当通过

c++ - "reserve or shrink"的正确方法指向已知 future 容量需求的 vector

我已经围绕一个长期存在的vector的共同主题编写了无数软件模块,有时(以未指定的频率)必须更新其内容。惯用语实现:voidLongLived::reconfigure(constInputT&whatever_input){m_vector.clear();m_vector.reserve(whatever_input.size());populate(m_vector,whatever_input);}请注意,惯用的实现方式永远不会减少其内部缓冲区的容量。如果这不行怎么办?只需使用shr​​ink_to_fit(),我想:voidLongLived::reconfigure(con

c++ - 循环 : future iterations overwrite results of previous iterations 中的 If-else 条件

我尝试在items列表中突出显示selectedItem及其children。constQListitems=/*...*/;Item*selectedItem=/*...*/;Q_FOREACH(Item*item,items){if(selectedItem==item){item->setHighlightEnabled(true);//Highlightselecteditem}else{item->setHighlightEnabled(false);//De-highlightotheritems}}item->setHighlightEnabled方法递归地对子项执行相同

c++ - std::promise 可以从非 POD 对象生成吗?

我的应用程序所做的其中一件事是监听和接收来自套接字的有效负载。我从不想阻止。在收到的每个有效负载上,我想创建一个对象并将其传递给工作线程,直到稍后再忘记它,这就是原型(prototype)代码的工作方式。但是对于生产代码,我想通过使用方便的异步方法来降低复杂性(我的应用程序很大)。async从promise中获取future。为此,我需要在下面由Xxx类表示的非POD对象上创建一个promise。我看不到有任何方法可以做到这一点(请参阅下面我的示例代码中的错误)。这里用async合适吗?如果是这样,我如何构建一个比int更复杂的promise/future对象(我看到的所有代码示例都使

c++ - 在 C++ 中解压参数包

我有两个函数f和g。f异步计算它的返回值并返回一个future。现在,基于f的几个返回值,我想调用g,但我想确保f的值的计算>并行发生。考虑以下代码:templatestd::futuref(T&t);templatevoidg(T&&...t)templatevoidcall_wrapper(T&&...t){autof1=f(t1);//HowdoIsetthevaluesoff1...fnautof2=f(t2);...g(f1.get(),f2.get()....);//HowdoIcallg}如何从call_wrapper函数的可变参数模板T中解压类型?

c++ - 在调用 future.get() 之前销毁 std::promise 是否可以?

我想知道是否可以调用promise.get_future(),将future移到其他地方(例如,放入vector中)并可能让promise在调用future.get()之前就死掉。在以下示例中,调用gateway->refreshWithCallback在线程中执行lambda,这样即使在第二个循环中future.get()尚未调用,共享指针也可以释放promise,这似乎有效,但我很生气!std::vector>futures;for(GuiGateway*gateway:gateways){std::shared_ptr>shared_promise_ptr(newstd::pro

C++11 future.wait_for() 总是返回 future_status::timeout

我有一个C++11程序来检查一个数是否为素数。程序等待准备就绪的future对象。准备就绪后,程序会告知future对象的提供者函数是否认为该数字是质数。//futureexample#include//std::cout#include//std::async,std::future#include//std::chrono::millisecondsconstintnumber=4;//444444443//anon-optimizedwayofcheckingforprimenumbers:boolis_prime(intx){for(inti=2;ifut=std::async

c++ - std::future.get() 有时卡在 os x 中

我有两个线程,一个线程应该接收和处理来自另一个线程的请求。第二种是同步传输请求和接收响应。我尝试了以下方案:成对队列(值(value),promise)。第一个线程创建一个promise并将其插入同步队列并等待future.get()的返回值问题是有时线程卡在future.get()上,但是当我暂停程序执行并继续时它再次正常工作。这个stucks具有随机​​性。FutureQueue.h#ifndefFutureQueue_h#defineFutureQueue_h#include#include#include#include#includetemplateclassWork{pub

c++ - 在 MSVC 的 Debug模式下分配给 std::future 时崩溃

与Release不同,在Debug模式下使用MSVC构建时,以下代码会随机崩溃。#includeusingnamespacestd;intmain(){autol=[](){};autof=async(launch::async,l);for(inti=0;i控制台输出显示:f:\dd\vctools\crt\crtw32\stdcpp\thr\mutex.c(51):mutexdestroyedwhilebusy完整的调用栈是:https://pastebin.com/0g2ZF5C1现在显然这只是一个压力测试,但我是不是在做一些非常愚蠢的事情?在我看来,将新任务重新分配给现有的fu

c++ - std::future::wait_for 虚假唤醒?

std::condition_variable::wait_for采用可选谓词在内部处理虚假唤醒。std::future::wait_for没有任何此类可选参数。如果我想确保等待指定的超时时间至少,或者是否已经以其他方式处理,是否需要防止虚假唤醒? 最佳答案 只有条件变量可以“虚假地”唤醒。显然,允许虚假唤醒简化了某些系统上条件变量的实现。(C++编程语言第4版。) 关于c++-std::future::wait_for虚假唤醒?,我们在StackOverflow上找到一个类似的问题: