Multithreading 在';就绪';获得锁

Multithreading 在';就绪';获得锁,multithreading,condition-variable,thread-synchronization,Multithreading,Condition Variable,Thread Synchronization,线程和并行编程真是把我搞糊涂了。在中,第9页指出的问题是,尽管线程可能被调度并处于ready状态,但这并不一定意味着它已经获取了锁 简单地说,等待锁定的线程(比如t1)通过条件变量得到通知,线程处于就绪状态,但不执行。但就在它可以运行任何东西之前,另一个线程被调度(比如t2)并执行。这意味着t1假定其被唤醒的条件不再成立 这是否意味着仅仅调度线程或将其置于就绪状态并不意味着它获得了锁?如果是这种情况,我必须始终将前提条件放入while循环中吗?这是虚假唤醒的另一种可能含义吗?还有,我还必须知道其

线程和并行编程真是把我搞糊涂了。在中,第9页指出的问题是,尽管线程可能被调度并处于
ready
状态,但这并不一定意味着它已经获取了锁

简单地说,等待锁定的线程(比如t1)通过
条件变量
得到通知,线程处于
就绪
状态,但不执行。但就在它可以运行任何东西之前,另一个线程被调度(比如t2)并执行。这意味着t1假定其被唤醒的条件不再成立

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

我总是假设如果线程从等待中被唤醒(这不是虚假的唤醒),它会立即获得锁(在这种情况下,wakeup=lock acquired),因为内核会跟踪这一点

这个问题与我发布的另一个问题密切相关

谢谢

我在哪里可以问这些noob问题,以一种互动的形式,有后续问题?这些看起来太蠢了

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

这样做是很好的做法。即使您知道在某些特定的硬件平台和操作系统上,wait()也不可能返回,除非条件为true;它可能在操作系统更新后表现出不同的行为,或者在代码移动到不同的平台时表现出不同的行为,或者在代码发生某些更改后表现出不同的行为

如果你曾经致力于开发“企业”软件,那么像这样的变化是可以而且将会发生的。不妨开始学习有助于避免未来灾难的好习惯

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


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

是的,我知道
wait
只有在锁被持有时才会返回。我的问题更具体。如果是内核跟踪锁/互斥锁,这是否意味着即使在执行
wait
中的第一条指令之前,锁仍处于“保持”状态?或者在
wait
的内部实现中是否有一些代码仅在能够获取锁时返回?如果是后者,那么我可以理解,
wait
可以在锁获取之前被中断,这可能会导致前置条件为false。了解以上2条中的哪一条是正确的,这将有助于我进行“超级觉醒”的推理。另外,你能给我一些书和资源,让我能够真正深入地阅读这些概念吗?我的操作系统书籍并没有澄清我所有的疑问。这是一本涵盖C++多线程深度的书。阅读这些将帮助我理解基本概念及其实现,帮助我进行推理。基本上,在阅读了它们之后,我应该能够回答我贴出的问题。如果能提供详细的资源,我将不胜感激。谢谢您的时间。@B_Dex_Float,对不起。我不是任何操作系统或语言支持库的提交者。我认为我没有资格谈论wait()和notify()的任何特定实现的细节,或者,为什么实现者选择以特定的方式来实现它。至于书,。。。这些只会带你走一段路。有些问题只能通过阅读实际的源代码或与编写它的人交谈来回答。Linux和GNU源代码在网上免费提供。感谢您的输入!但是,如果你有任何的书在脑海中,即使他们只采取了这么远,请随时删除一些链接,因为我相信赫克可以使用他们在我目前的理解水平(我在这方面有点初学者,所以所有的帮助帮助!)。非常感谢。请随意删除一些链接到书籍和资源,其中详细介绍了并行编程,C++线程。我找不到资源。书籍将是理想的资源。非常感谢。