gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:32:34 25 4
gpt4 key购买 nike

传统的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com