Multithreading C/C+中的条件变量使用模式+;和其他语言 如果您查看描述条件变量(CV)的文档,您会看到,例如在PThreads和C++中,不需要在CV上保存CV的互斥体来调用通知。然而,例如在Java和Python中,必须锁定互斥锁才能执行相同的操作

Multithreading C/C+中的条件变量使用模式+;和其他语言 如果您查看描述条件变量(CV)的文档,您会看到,例如在PThreads和C++中,不需要在CV上保存CV的互斥体来调用通知。然而,例如在Java和Python中,必须锁定互斥锁才能执行相同的操作,multithreading,conditional-statements,mutex,thread-synchronization,Multithreading,Conditional Statements,Mutex,Thread Synchronization,考虑到像Java这样的语言的实现最终会使用一些本机线程工具,那么采用这种方式实现东西有什么深层次的原因吗?Javanotify和notifyAll基本同步工具都要求在调用它们之前在对象上进行同步。这是一个简单的安全点,因为它还要求您在等待之前对它们进行同步 例如,如果您有两个线程。一个线程从缓冲区读取数据,一个线程将数据写入缓冲区 读取数据线程需要等待,直到写入数据线程将一个数据块写入缓冲区,然后才能读取该块 如果可以在不同步的情况下调用wait()、notify()和notifyAll()方法

考虑到像Java这样的语言的实现最终会使用一些本机线程工具,那么采用这种方式实现东西有什么深层次的原因吗?

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

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

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

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

  • 读取线程调用
    wait()
    ,该线程被添加到等待队列中

  • 同时,写入线程调用
    notify()
    ,表示它已添加数据

  • 读取线程将错过更改并一直等待,因为在执行
    wait()
    之前处理了
    notify()


通过强制
wait
notify
在同步块中发生,此争用条件将被删除。

可能不只是在pthreads上实现。。但这只是一个假设。我觉得这个问题可能会更好(甚至任何)答案…显然,JVM可以实现它,但它是一个常见的错误,我已经看到很多,许多人在C++中的可能性低,在一个相当低的成本(你需要持有一个锁更长的时间,但就是这样)@Voo错误在于修改条件所依赖的数据时未保持互斥锁?@vehsakul在不保持锁的情况下检查条件(通常取决于所修改的数据)。是的,在某些情况下这是完全正确的,但它为bug创造了一个巨大的机会。托管语言归根结底都是为了安全而交易性能选项。就我个人而言,我觉得在这里进行权衡是合理的,我不认为有很多现实生活中的例子会有很大的不同。@Voo好吧,你关于安全与性能的观点很清楚。