【问题标题】:checking whether fork() is safe检查 fork() 是否安全
【发布时间】:2010-12-06 16:56:40
【问题描述】:

如果进程中有多个线程,fork() 的行为是不确定的。如何检查是否只有一个线程(主要在 linux 上,但 windows、darwin 也很感兴趣)?

【问题讨论】:

  • 等等。为什么这不是一个真正的问题?有没有我错过的编辑? (虽然没有看到编辑历史记录?)
  • @Matti Virkkunen:最初发布的问题没有正文(只是enter code here)和一个完全不同的标题。
  • @Matti:它是insert code here,但此后一直被编辑——x 分钟内的编辑似乎没有被记录下来。我赞成并投票重新开放。
  • 作为参考,Windows 没有fork() 系统调用。
  • 我很确定 fork() 为多个线程定义的。你有什么证据证明它不是?

标签: linux multithreading pthreads


【解决方案1】:

在 Linux 下,fork() 的行为在多线程进程中不是未定义的,但它所做的事情通常不是很有帮助。

或者更确切地说,如果您 fork() 并且不立即调用 exec(),则可能会导致未指定资源的泄漏,可能包括可能导致死锁的锁。

当然可以询问Linux(通过procfs)当前线程组中有多少线程。如果答案是 1,则意味着该进程是单线程的。

【讨论】:

  • 是的,这就是我最终要做的(procfs 的事情)。我们会看看达尔文有什么好办法。
  • 你真的必须希望,在你确定进程中只有一个线程之后,没有人有一个信号处理程序在你分叉之前启动一个新的。至少这似乎不太可能。
【解决方案2】:

这是不可能的。使用 pthreads,您可以使用 pthread_is_multithreaded_np() 函数,但它会使您的 fork() 代码依赖于 pthreads,并且它不适用于所有平台。而且无论线程​​库如何,都无法进行检查。

如果这是一个应用程序,请不要同时使用线程和分叉。如果您正在编写线程程序,请不要调用fork()(fork/execv 组合除外)。

如果这是一个库,要么不要在其中使用fork(),要么要求该库永远不与线程应用程序一起使用。

对于应用程序,您也可以尝试使用pthread_atfork(...) 以确保调用fork() 是安全的。

【讨论】:

  • pthread_is_multithreaded_np 只是线程创建超出了我的控制范围。
  • 呸,pthread_is_multithreaded_np() 在 Linux 上不可用。
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多