Multithreading 关于线程和死锁的一些问题

Multithreading 关于线程和死锁的一些问题,multithreading,Multithreading,若父进程正在使用资源,而子进程也将获得相同的资源,那个么父进程和子进程是否会处于死锁状态?如果父线程包含两个线程呢?孩子也会得到2个线程吗?fork如何实现线程安全?中的一句话描述是 死锁是指两个或多个相互竞争的操作都在等待另一个操作完成,因此两个操作都没有完成 最简单的情况是两个线程和两个资源 线程A: acquireResource(r1) acquireResource(r2) // Do stuff releaseResource(r1) releaseResourc

若父进程正在使用资源,而子进程也将获得相同的资源,那个么父进程和子进程是否会处于死锁状态?如果父线程包含两个线程呢?孩子也会得到2个线程吗?fork如何实现线程安全?

中的一句话描述是

死锁是指两个或多个相互竞争的操作都在等待另一个操作完成,因此两个操作都没有完成

最简单的情况是两个线程和两个资源

线程A:

  acquireResource(r1)
  acquireResource(r2)
  // Do stuff
  releaseResource(r1)
  releaseResource(r2)
线程B:

  acquireResrouce(r2)
  acquireResource(r1)
  // Do stuff
  releaseResource(r1)
  releaseResource(r2)
对于此代码,如果发生以下事件序列,则会发生死锁

  • 线程A获得r1
  • 上下文切换到线程B
  • 线程B获得r2
  • 此时线程A无法继续,因为它的r2已经拥有,线程B无法继续,因为r1已经拥有。因此,这两个线程都不能继续释放资源。这是一个僵局


    为了避免这种简单的情况,可以确保在整个代码中以相同的顺序获取资源。例如,如果线程B首先获取r1,则不会出现死锁。实现僵局还有很多其他的方法,尽管这些方法很难避免。

    真的很难说。为什么不试着问一个非常具体的问题,一个资源,一个共享场景?一些资源可以共享;有些人不能。有些可以通过某些方式共享,但不能通过其他方式共享。例如,内存通常可以读取,但不能在没有同步的情况下同时写入,而CPU则由操作系统为您进行仲裁。此外,如果您认为您收到了问题的有价值的答案,您可能希望接受一个优秀的答案,以奖励那些为您提供帮助的人。