multithreading - C/C++ 和其他语言中的条件变量使用模式

标签 multithreading conditional-statements mutex thread-synchronization

如果您查看描述条件变量 (cv) 用法的文档,您会看到例如在 PThreads 和 C++ 中,您无需持有 cv 的互斥锁即可在此 cv 上调用 notify。而例如在 Java 和 Python 中,您必须锁定互斥体才能执行相同的操作。

考虑到像 Java 这样的语言的实现最终会使用一些 native 线程工具,那么以这种方式实现事情是否有一些深刻的原因(我是关于后一种情况)?

最佳答案

Java notifynotifyAll基本的同步工具都要求您在调用它们之前对对象进行同步。这是为了一个简单的安全点,因为它还要求您在 wait 之前同步它们。 ing。

例如,如果您有两个线程。一个线程从缓冲区读取数据,一个线程将数据写入缓冲区。

读数据线程需要等待,直到写数据线程完成将一个数据 block 写入缓冲区,然后才能读取该 block 。

如果 wait() , notify() , 和 notifyAll()可以在不同步的情况下调用方法,然后您可以获得竞争条件,其中:

  • 阅读线程调用wait()并且线程被添加到等待队列中。
  • 同时,写线程调用notify()表示它已添加数据。
  • 读取线程错过了更改并从 notify() 开始一直等待。在 wait() 之前处理曾是。

  • 通过强制 waitnotify在同步块(synchronized block)内发生此竞争条件被删除。

    关于multithreading - C/C++ 和其他语言中的条件变量使用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537418/

    相关文章:

    c++ - 槽中的 QMutex

    java - 如何从启动器运行 Java Swing 游戏的动画线程?

    c# - 为什么整数属性有时会返回 0?

    java - 一旦线程被中断,如何完全停止它?

    汇编条件跳转

    来自 Eloquent Javascript 的 Javascript 递归

    multithreading - 授予对 std::mutex 的优先访问权

    java - 多线程程序中出现意外结果

    Javascript、URL 解析、条件 CSS 样式。在导航菜单上显示

    c - 竞争条件和互斥体