为什么 C++/Java 内存模型不包含条件变量
Why doesn't the C++/Java memory model include condition variables
我指的是 C++11 内存模型的正式定义(Mark Batty 等人),其中包括原子、锁、宽松的内存模型,但没有关于条件变量行为的正式定义。同样在 Java 内存模型中,也没有定义 wait() 和 notify() 机制。这是为什么?
Similarly in Java Memory Model, there also is no definition on the wait() and notify() mechanisms. Why is that?
因为是内存模型。它建模/指定多线程应用程序中内存读取和内存写入操作的行为。
wait()
和 notify()
的行为方面(在某种意义上)emergent 来自内存模型。对 wait()
和 notify()
的调用必须使用原始互斥体。这意味着 lock 和 unlock 操作发生在特定点,并且(在 wait()
的情况下)它们被指定为执行 unlock 和 lock 在某些情况下的操作。这些操作是在内存模型中建模的……这使得条件变量的紧急语义听起来很合理,前提是您坚持推荐的实现它们的模式。
wait()
和 notify()
的其他方面在 JLS 中指定。它与内存模型在同一章中。但是不同的部分。 17.2 而不是 17.4。其余行为在 javadoc 中定义。
您似乎关心 C++ 的一个细节 "model",它甚至不包括未定义的行为、破坏原子的能力等。该模型从根本上来说是不健全且毫无意义的,所以您为什么还要麻烦吗?
我指的是 C++11 内存模型的正式定义(Mark Batty 等人),其中包括原子、锁、宽松的内存模型,但没有关于条件变量行为的正式定义。同样在 Java 内存模型中,也没有定义 wait() 和 notify() 机制。这是为什么?
Similarly in Java Memory Model, there also is no definition on the wait() and notify() mechanisms. Why is that?
因为是内存模型。它建模/指定多线程应用程序中内存读取和内存写入操作的行为。
wait()
和 notify()
的行为方面(在某种意义上)emergent 来自内存模型。对 wait()
和 notify()
的调用必须使用原始互斥体。这意味着 lock 和 unlock 操作发生在特定点,并且(在 wait()
的情况下)它们被指定为执行 unlock 和 lock 在某些情况下的操作。这些操作是在内存模型中建模的……这使得条件变量的紧急语义听起来很合理,前提是您坚持推荐的实现它们的模式。
wait()
和 notify()
的其他方面在 JLS 中指定。它与内存模型在同一章中。但是不同的部分。 17.2 而不是 17.4。其余行为在 javadoc 中定义。
您似乎关心 C++ 的一个细节 "model",它甚至不包括未定义的行为、破坏原子的能力等。该模型从根本上来说是不健全且毫无意义的,所以您为什么还要麻烦吗?