【问题标题】:How is a thread waiting for mutex put back to running?等待互斥锁的线程如何重新运行?
【发布时间】:2017-07-10 23:35:02
【问题描述】:

上下文是这样的:

  • 线程试图锁定已锁定的互斥体
  • 线程进入休眠/阻塞状态
  • 一段时间后,互斥锁被解锁

Q1) 那会发生什么?

线程会立即恢复运行吗?或者内核仍然会等待正在运行的线程消耗它的时间片并正常调度等待的线程?

Q2) 如果互斥锁没有永远解锁怎么办?内核如何决定让线程等待?

【问题讨论】:

  • 闻起来像作业......或考试
  • 如果互斥锁从未解锁,您的程序就会出现死锁,就内核而言,这是您的问题
  • @LPs NO - 这是一个面试问题。我认为内核会正常安排等待线程,并在重新运行之前再次检查互斥锁状态。但不确定。
  • @StoryTeller 我完全清楚这一点,这不是问题所在。问题是关于死锁/永远等待的实现细节。
  • @guardian 你对可能发生的事情的想法应该在你的问题中,而不仅仅是在评论不适中。它实际上会借给帖子的内容,并表现出努力和思考,而不仅仅是寻找答案。只是一个建议。

标签: c multithreading pthreads mutex wait


【解决方案1】:

线程会立即恢复运行吗?或者内核仍然会等待正在运行的线程消耗它的时间片并正常调度等待的线程?

通常,线程现在可以运行了。在大多数系统上,如果有可用的核心,它将立即开始运行。如果不是,那么下次在任何内核上调用调度程序时都会考虑它。

如果互斥锁没有永远解锁怎么办?内核如何决定让线程等待?

通常,线程在唤醒时做的第一件事就是尝试锁定互斥体。如果失败,它会再次阻塞。某些实现在准备好运行之前将互斥锁分配给特定线程,在这种情况下,线程会通过互斥锁唤醒。

实现方式各不相同,可以做任何符合要求的事情。

【讨论】:

  • 内核如何神奇地将等待线程设置为准备运行?内核可以用来翻转状态的互斥锁是否有某种等待线程列表?
  • @FaceBro - 显然操作系统必须一直跟踪所有线程,所以它只知道。 C 和 Posix 并没有说明它应该如何做到这一点,但是拥有一些线程 ID 列表可能是一个好方法。
  • @FaceBro 我最熟悉 Linux 的实现,这正是它的工作原理。
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2021-02-19
  • 2010-12-07
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多