传统的 C++ 非常简单,只有一个旨在创建线程的库(如 pthread)会产生其他线程。
现代 C++ 更接近 Java,许多函数都是基于线程的,线程池准备好运行异步作业等。某些库(包括标准库)更有可能使用线程来异步计算某些函数,或者设置基础架构以执行此操作,即使它未被使用也是如此。
在这种情况下,使用像 fork 这样具有全局影响的函数是否安全?
最佳答案
与 C++ 中的几乎所有其他问题一样,这个问题的答案是“视情况而定”。
如果我们假设程序中还有其他线程,并且这些线程正在相互同步,调用 fork
很危险。这是因为,fork
不等待所有线程成为一个同步点(即互斥锁释放)来fork进程。在 fork 进程中,只有调用 fork
的线程将出现,而其他人将被终止,可能在关键部分的中间。这意味着与其他线程共享的任何内存都不是 std::atomic<int>
或类似的,是一个未定义的状态。
如果您的 fork 进程从该内存中读取,或者确实期望其他线程正在运行,则它可能无法可靠地工作。但是,fork
的大多数用途实际上程序状态没有先决条件。这是因为最常见的做法是立即调用 execv
或类似于生成子进程。在这种情况下,您的整个流程有点被一些新流程“取代”,旧流程的所有内存都被丢弃。
tl;dr - 调用 fork
在多线程程序中可能不安全。有时是安全的;就像还没有产生线程一样,或者 evecv
立即被调用。如果您使用 fork
对于其他情况,请考虑改用线程。
参见 fork man page和 this helpful blog post对于细节。
关于c++ - 是否可以在现代 C++ 中使用 fork?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59132799/