c++ - 是否可以在现代 C++ 中使用 fork?

标签 c++ multithreading fork threadpool

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

现代 C++ 更接近 Java,许多函数都是基于线程的,线程池准备好运行异步作业等。某些库(包括标准库)更有可能使用线程来异步计算某些函数,或者设置基础架构以执行此操作,即使它未被使用也是如此。

在这种情况下,使用像 fork 这样具有全局影响的函数是否安全?

最佳答案

与 C++ 中的几乎所有其他问题一样,这个问题的答案是“视情况而定”。

如果我们假设程序中还有其他线程,并且这些线程正在相互同步,调用 fork很危险。这是因为,fork不等待所有线程成为一个同步点(即互斥锁释放)来fork进程。在 fork 进程中,只有调用 fork 的线程将出现,而其他人将被终止,可能在关键部分的中间。这意味着与其他线程共享的任何内存都不是 std::atomic<int>或类似的,是一个未定义的状态。

如果您的 fork 进程从该内存中读取,或者确实期望其他线程正在运行,则它可能无法可靠地工作。但是,fork 的大多数用途实际上程序状态没有先决条件。这是因为最常见的做法是立即调用 execv或类似于生成子进程。在这种情况下,您的整个流程有点被一些新流程“取代”,旧流程的所有内存都被丢弃。

tl;dr - 调用 fork在多线程程序中可能不安全。有时是安全的;就像还没有产生线程一样,或者 evecv立即被调用。如果您使用 fork对于其他情况,请考虑改用线程。

参见 fork man pagethis helpful blog post对于细节。

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

相关文章:

C程序-for循环中的fork命令

c - 子进程中的变量修改

c++ - 有哪些符合 C++ 标准的自定义分配器可用?

c++ - 为什么 CSpinButtonCtrl 不能正确处理大于 1000 的数字?

c++ - strlen 是否针对字符串文字进行了优化?

C# - 从工作线程而不是主线程访问时,类字段为空

c++ - 在 Linux 中将 fork() + execlp 与 boost::asio 一起使用时解决重用错误

c++ - 在 OpenCV 中将图像转换为彩色铅笔素描

objective-c - 为什么我对 NSLock 的使用不起作用?

c++ - std::thread 在我可以分离它之前完成