如何解决C ++中的forkvs std :: async
我对asyc和fork的概念并不陌生,直到现在我才了解到fork()创建了将异步运行的chid进程。 如果我提到 std :: launch :: async ,则std :: async将从系统池创建一个线程并在此处异步启动它。
例如,下面的代码集有何不同? 1:使用std :: async
std::vector<std::future<void>> result;
for(i=0;i<5;i++){
result. push_back(std::async(std::launch::asyc,foo,var1));
}
for( auto e : result)
e.get();
2nd:使用fork()
for(i=0;i<5;i++){
if(fork()==0){
foo(var1);
exit(0);
}
}
假定foo函数的返回类型为void,并且将参数作为引用或指针传递。
解决方法
关键区别在于,在std::async
的情况下,两个执行线程共享一个进程。对于fork
,它们每个都有自己的过程。
此差异最明显地影响通话后发生变化的事物。对于fork
,每个进程然后可以打开和关闭自己的文件描述符,管理自己的内存空间,等等。对于std::async
,线程将继续共享文件描述符,内存空间等。
fork()
fork()
通过复制调用进程来创建子进程 。子进程与父进程分离,因此每个进程都有其自己的内存,并且如果不建立任何进程间通信通道,则不可能在两个进程之间传递数据。调用fork()
的最常见用例是启动一个进程作为后台服务(也称为“守护程序”)。例如,当您在命令行上启动您喜欢的Web服务器时,它可能会派生一个子进程(实际的服务器进程)。一旦完成,主过程结束,因此控制权将返回到您的Shell,您可以执行其他操作。
std::async
std::async
在单独的 thread 中执行功能(假设策略为std::launch::async
)。它返回一个std::future
,您可以在其上调用get()
以获取该函数返回的值(假定它已返回并且没有引发异常)。如果函数在此期间完成,则get()
调用将立即返回,否则将阻塞直到函数返回。此功能使std::async
成为有用的工具,可在后台执行其他操作时又进行昂贵的计算。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。