2016-02-09 79 views
16

我知道C++ 11增加了对线程的支持。例如:C++标准是否支持进程?

#include <iostream> 
#include <thread> 

void bar() 
{ 
    std::cout << "bar()\n"; 
} 

int main() 
{ 
    std::thread thread(bar); 
    thread.join(); 

    return 0; 
} 

然而,有没有在单独的过程来执行bar功能的方法吗?如果没有,是否有关于是否应该添加这样的功能的讨论?

注意:我意识到使用独立于平台的库的可能性,如果C++直接支持或将来会支持,我只是好奇。

+0

'fork' .......? –

+1

@MarcB这不是一个C++标准功能吗?换句话说,它必须由特定的编译器提供,对吗? –

+6

'fork'不在标准库中,它是一个posix函数。 – ThomasMcLeod

回答

6

不,C++标准(特别是C++ 11)不具有过程(因此我不能在这里给你一个更合理的参考从最流行,目前最一search result任何概念最新的C++文档站点)。我也不知道对下一个标准版本C++ - 17(又名C++ - 1z)计划进程支持。至少Wikipedia Site没有提到它。

有一个流行的implementation提出了提升,但从来没有为C++标准提案绘制。

您通常无法编写便携代码在裸机系统上运行,其中只有一个进程存在。


然而,有一个单独的进程来执行bar()功能的方法吗?

要做到这一点最简单的方法是由POSIX公开组指定退却到fork()wait()

#include <iostream> 
#include <unistd.h> 
#include <sys/wait.h> 

void bar() 
{ 
    std::cout << "bar()\n"; 
}  

int main(int argc, char **argv) 
{ 
    pid_t pid = fork(); 

    if (pid == 0) 
    { 
     // child process 
     bar(); 
    } 
    else if (pid > 0) 
    { 
     // parent process 
     wait(NULL);  
    } 
    else 
    { 
     // fork failed 
     std::cerr << "fork() failed!" << std::endl; 
     return 1; 
    } 


    return 0; 
} 

虽然我没有看到多少点的创建额外的过程来执行一个简单的功能。在这种情况下,创建一个进程会产生很多你不想要的开销。

那么,如果你想使用exec()函数族的函数来启动另一个程序,这是一个不同的用例。

我建议坚持std::thread s为例。

+0

问题中的示例代码仅用于说明。我实际上不会尝试在单独的过程中运行它。 –

+1

@JamesAdkison所以你的问题是关于从你的代码中启动另一个可执行文件,就像我提到的有关使用exec()函数的提示一样? C++标准支持的唯一函数是'std :: system()'AFAIK,但它有其局限性。 –

+1

注意:这个解决方案在Windows中不能很好地扩展,执行'fork'等效的速度非常慢。 –