【问题标题】:Does a thread in 'ready' state acquire a lock处于“就绪”状态的线程是否获得锁
【发布时间】:2020-02-09 16:06:22
【问题描述】:

线程和并行编程真的让我很困惑。在第 9 页的this book 中,陈述的问题是,尽管线程可能被调度并置于ready 状态,但这并不一定意味着它已经获得了锁。

简而言之,等待锁的线程(例如 t1)通过condition_variable 通知,并且该线程处于ready 状态,但未执行。但就在它可以运行任何东西之前,另一个线程被调度(比如 t2)并执行。这意味着 t1 假设它被唤醒的条件不再成立。

这是否意味着仅仅调度一个线程或将其置于就绪状态并不意味着它获得了锁?如果是这种情况,我是否必须总是将前提条件放在 while 循环中?这是虚假唤醒的另一种可能含义吗?另外,我还必须注意哪些其他类似情况?

我一直假设如果一个线程从等待中被唤醒(这不是虚假唤醒),它会立即获取锁(在 this 情况下,唤醒 = 获取锁) ,因为内核会跟踪这一点。

这个问题与我在here 发布的其他问题密切相关。

谢谢。

我在哪里可以问这些菜鸟问题,以一种带有后续问题的互动形式?这些对于stackoverflow来说似乎太愚蠢了。

【问题讨论】:

  • 请随意删除一些关于并行编程、C++ 线程处理详细的书籍和资源的链接。我很难找到资源。书籍将是理想的资源。谢谢。

标签: multithreading condition-variable thread-synchronization


【解决方案1】:

我必须总是将条件放在一个while循环中吗?

这样做是个好习惯。即使您知道在某些特定的硬件平台和操作系统上,除非条件为真,否则 wait() 也不可能返回;操作系统更新后它的行为可能会有所不同,或者如果您的代码移动到不同的平台,它的行为可能会有所不同,或者在对代码进行一些更改后它的行为可能会有所不同。

如果您曾经开发过“企业”软件,那么这样的改变就会发生并且将会发生。不妨开始学习有助于避免未来灾难的好习惯。

我一直假设如果一个线程从等待中被唤醒(这不是虚假唤醒),它会立即获得锁

您可以放心地假设wait()任何 情况下都不会返回,直到互斥体被重新锁定。整个 wait()/notify() 范式取决于它的行为方式。

【讨论】:

  • 是的,我明白wait 仅在持有锁时返回。我的问题更具体。如果是内核跟踪锁/互斥锁,这是否意味着即使在wait 中的第一条指令执行之前,锁就被“持有”了?或者wait 的内部实现中是否有一些代码仅在能够获取锁时才返回?如果是后者,那么我可以理解wait 可以在获取锁之前被中断,可能会导致前置条件为假。了解上述 2 中的哪一个是正确的将有助于我推理“虚假唤醒”。
  • 另外,您能否指导我阅读一些书籍和资源,让我真正深入地阅读这些概念? 我的操作系统书籍并没有解决我所有的疑问。这和一本深入介绍 C++ 多线程的书。阅读这些将帮助我理解基本概念及其实现,帮助我推理这些。基本上,在阅读它们之后,我应该能够回答我发布的问题。我非常感谢那些详细处理的资源。感谢您的宝贵时间。
  • @B_Dex_Float,对不起。我不是任何操作系统或语言支持库的提交者。我认为我没有资格谈论 wait() 和 notify() 的任何特定实现的细节,或者为什么实现者选择以特定方式执行它。至于书,……那些只会带你走一部分路。有些问题只能通过阅读实际源代码或与编写它的人交谈来回答。 Linux 和 GNU 源代码可在线免费获得。
  • 感谢您的意见!但是,如果您确实有任何书籍,即使它们仅到目前为止,也请随意删除一些链接,因为我确信可以在我目前的理解水平上使用它们(我在这方面有点初学者,所以所有帮助都有帮助!)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 2018-06-03
  • 2019-06-02
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多