C++ fork()与std::async在C++;

C++ fork()与std::async在C++;,c++,multithreading,c++11,C++,Multithreading,C++11,我对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::

我对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();
std::向量结果;

对于(i=0;i而言,关键区别在于在
std::async
的情况下,两个执行线程共享一个进程。在
fork
的情况下,它们各自有自己的进程

这种差异对调用后的更改影响最大。对于
fork
,每个进程可以打开和关闭自己的文件描述符,管理自己的内存空间,等等。对于
std::async
,线程继续共享文件描述符、内存空间等等。

fork()
通过复制调用进程创建子进程。子进程与父进程分离,因此每个进程都有自己的内存,如果不设置任何进程间通信通道,则无法在两个进程之间传递数据。调用
fork()的最常见用例
是作为后台服务启动一个进程(也称为“守护进程”)。例如,当您在命令行上启动您最喜欢的web服务器时,它可能会派生出一个子进程(实际的服务器进程)。完成后,主进程将结束,因此控制权将返回shell,您可以执行其他操作

std::async

在单独的线程中执行函数(假设策略
std::launch::async
)。它返回一个
std::future
,您可以在该线程上调用
get()
,以获取函数返回的值(假设该函数返回且未引发异常)。
get()
如果函数在此期间已完成,则调用会立即返回,否则它会阻塞直到函数返回。此功能使
std::async
成为一个有用的工具,可以在后台运行昂贵的计算,同时执行其他操作。

您确实在询问生成进程和sp之间的区别雨篷线程。关于这些主题,你的操作系统书怎么说?首先,
std::async
fork
@StephenNewell:OP在询问之前必须意识到有区别。在某些平台上,没有区别。使用fork“从”计算是在另一个内存空间中进行的。您不能期望轻松地将计算值恢复到原始值。线程在同一个进程中执行。Fork创建一个新进程,它与所有进程一样,与其他进程隔离。
for(i=0;i<5;i++){ 
    if(fork()==0){
        foo(var1);
        exit(0);
    }
}