假设现在有一个进程A,它有三个线程,如下:
在多线程中fork时的问题
现在在线程1中fork,操作系统只会复制线程1,而线程2,线程3都会被抛弃而消失,
在进程A中的线程1 fork()后产生的进程B,如下:
在多线程中fork时的问题
可以看到在fork之后,线程2,线程3都消失了,只有线程1,这就存在问题了。
加入在进程A的线程1 fork之前,有一个锁,被线程2持有,然后fork之后,线程2又消失了,相当与这个锁被一直持有了,如果这个时候,进程B的线程1也想持有该锁,这个时候,就会引起死锁。
而在linux编程中,malloc这个函数在运行时会加锁,printf也会锁住stdout,stderr,还有很多函数在实现时会加锁。
所以,多线程后fork极其不安全。
所以建议如果一定要多线程后fork,建议fork之后用execv替换为新的程序。

相关文章:

  • 2021-12-18
  • 2021-09-22
  • 2021-10-29
  • 2022-01-01
  • 2021-08-17
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-03-06
  • 2022-12-23
  • 2021-12-04
  • 2021-08-26
  • 2021-11-24
相关资源
相似解决方案