如果您查看描述条件变量 (cv) 用法的文档,您会看到例如在 PThreads 和 C++ 中,您无需持有 cv 的互斥锁即可在此 cv 上调用 notify。而例如在 Java 和 Python 中,您必须锁定互斥体才能执行相同的操作。
考虑到像 Java 这样的语言的实现最终会使用一些 native 线程工具,那么以这种方式实现事情是否有一些深刻的原因(我是关于后一种情况)?
最佳答案
Java notify
和 notifyAll
基本的同步工具都要求您在调用它们之前对对象进行同步。这是为了一个简单的安全点,因为它还要求您在 wait
之前同步它们。 ing。
例如,如果您有两个线程。一个线程从缓冲区读取数据,一个线程将数据写入缓冲区。
读数据线程需要等待,直到写数据线程完成将一个数据 block 写入缓冲区,然后才能读取该 block 。
如果 wait()
, notify()
, 和 notifyAll()
可以在不同步的情况下调用方法,然后您可以获得竞争条件,其中:
wait()
并且线程被添加到等待队列中。 notify()
表示它已添加数据。 notify()
开始一直等待。在 wait()
之前处理曾是。 通过强制
wait
和 notify
在同步块(synchronized block)内发生此竞争条件被删除。
关于multithreading - C/C++ 和其他语言中的条件变量使用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537418/