传统的C ++非常简单,只有旨在创建线程的库(如pthread)才产生其他线程。

现代C ++更加接近Java,因为许多功能都是基于线程的,线程池已准备好运行异步作业,等等。更有可能的是,某些库(包括标准库)使用线程来异步计算某些函数,或者设置了线程。即使不使用它,也可以这样做。

在这种情况下,使用具有全局影响力的功能(例如fork)是否安全?

最佳答案

与C ++中几乎所有其他内容一样,此问题的答案是“取决于”。

如果我们假设程序中还有其他线程,并且这些线程正在彼此同步,则调用fork是危险的。这是因为fork不会等待所有线程成为同步该进程的同步点(即互斥体释放)。在分支过程中,仅存在名为fork的线程,而其他线程可能已经在关键部分的中间被终止了。这意味着与其他线程共享的任何内存(不是std::atomic<int>或类似名称)都是未定义状态。

如果您的分支进程从该内存中读取,或者确实希望其他线程正在运行,则它可能无法可靠地工作。但是,fork的大多数用法实际上对程序状态实际上没有任何先决条件。这是因为最常见的做法是立即调用execv或类似方法以生成子进程。在这种情况下,整个过程会被某个新过程“替换”,而旧过程中的所有内存都将被丢弃。

tl; dr-在多线程程序中调用fork可能不安全。有时很安全;例如尚未产生任何线程,或者立即调用evecv。如果将fork用于其他用途,请考虑使用线程代替。

详见fork man pagethis helpful blog post

关于c++ - 在现代C++中可以使用fork吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59132799/

10-17 01:49