Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用PPL开火然后忘记?_C++_Multithreading_Ppl - Fatal编程技术网

C++ 用PPL开火然后忘记?

C++ 用PPL开火然后忘记?,c++,multithreading,ppl,C++,Multithreading,Ppl,我希望在我的应用程序中开始使用PPL。(我目前正在使用std::async) 然而,我有两种(丑陋的)情况,我必须调用长时间运行的函数,这些函数不会返回任何结果。(存储到数据库和网络调用)。我不等待它们在主循环结束时完成(因为它们非常慢),而只是继续进行下一个迭代。为此,我为这些函数调用生成线程,并分离线程。我相信这就是所谓的火与忘 有没有一种方法可以让PPL做到“火与忘”呢?我希望避免创建自己的线程,并使用voidppl任务。PPL任务是否在析构函数中阻塞?因此,您将启动无限数量的网络调用或数

我希望在我的应用程序中开始使用PPL。(我目前正在使用std::async)

然而,我有两种(丑陋的)情况,我必须调用长时间运行的函数,这些函数不会返回任何结果。(存储到数据库和网络调用)。我不等待它们在主循环结束时完成(因为它们非常慢),而只是继续进行下一个迭代。为此,我为这些函数调用生成线程,并分离线程。我相信这就是所谓的火与忘


有没有一种方法可以让PPL做到“火与忘”呢?我希望避免创建自己的线程,并使用voidppl任务。PPL任务是否在析构函数中阻塞?

因此,您将启动无限数量的网络调用或数据库存储,从不等待任何任务完成,也不知道任何任务是否完成,创建新线程、新线程和新线程?在应用程序关闭时,您预计会发生什么?那么,为什么不在应用程序关闭后将其恢复呢?你甚至不必马上把它们捡起来:你只需收割完的就可以了。关机时,您可以等待一段合理的时间,如果它们没有消失,您可以记录警告/通知用户,并强制关机。Fire and forget操作编写起来很有趣,但要么您的框架应该处理清理(因此在用户端是Fire and forget,但在实现中不是),要么您应该在非玩具应用程序中自己处理。对于实际问题,假设系统负载很高,并且db调用(可能是编写)不会针对循环运行。下一个循环运行,另一个db调用排队。它首先被安排。现在,您有了一对很难重现的无序db写操作,这导致了数据库的不一致性,没有任何线索可以追溯到发生了什么。更糟糕的是,这种情况很少发生,这意味着黑匣子QA将错过它,即使在出现回归时修复它,黑匣子QA也不会注意到它。朋友不会让朋友随意发布线程。试试fire,别忘了。对于应该排序的事情,需要一个任务队列(例如,db编辑,如果排序的话,更容易进行推理)。对于重新启动时应该放弃的任务(例如,将当前状态推给某个报告程序——如果队列出现问题,请完成当前任务,然后启动最新的任务)。关闭时,您仍然有这些队列。您甚至可以支持有限数量的并行尝试。所有这些都不需要大量的运行时成本。通过重用工作线程,您甚至可以获得更好的运行时性能,而不是每次都启动一个新线程。有序任务可以作为连续任务安排。如果要取消所有计划的任务,则continuations可以使用取消令牌,您只需将该令牌设置为cancelled即可。您可以在主循环中保留用于创建取消令牌的取消令牌源,以便从主循环中取消任务。我写了这篇文章,你可能会发现很有趣——它是关于例外情况的(我还没有提到取消),但取消的工作方式类似。