C++(可能是java)如何锁定对象进行同步? 当对象被锁定在C++和java语言中,实际上是在低级别的范围内执行的?我认为这与CPU/缓存或RAM无关。我最好的估计是,这发生在操作系统的某个地方?它会在执行上下文切换的操作系统的同一部分中吗
我指的是锁定对象、在Java方法签名上同步等等C++(可能是java)如何锁定对象进行同步? 当对象被锁定在C++和java语言中,实际上是在低级别的范围内执行的?我认为这与CPU/缓存或RAM无关。我最好的估计是,这发生在操作系统的某个地方?它会在执行上下文切换的操作系统的同一部分中吗,java,c++,synchronization,locking,Java,C++,Synchronization,Locking,我指的是锁定对象、在Java方法签名上同步等等 P> >答案可能取决于哪个特定的锁定机制?< P>在C++中没有对象锁定的概念。您通常会在操作系统特定函数的基础上实现自己的功能,或者使用库提供的同步原语,例如boost::scoped_lock。如果您可以访问C++11,那么您可以使用线程库提供的锁,该库具有类似的接口来boost 爪哇,JVM也一样。 < P> C++中没有对象锁定的概念。您通常会在操作系统特定函数的基础上实现自己的功能,或者使用库提供的同步原语,例如boost::scope
<> P> >答案可能取决于哪个特定的锁定机制?< P>在C++中没有对象锁定的概念。您通常会在操作系统特定函数的基础上实现自己的功能,或者使用库提供的同步原语,例如boost::scoped_lock。如果您可以访问C++11,那么您可以使用线程库提供的锁,该库具有类似的接口来boost
爪哇,JVM也一样。
< P> C++中没有对象锁定的概念。您通常会在操作系统特定函数的基础上实现自己的功能,或者使用库提供的同步原语,例如boost::scoped_lock。如果您可以访问C++11,那么您可以使用线程库提供的锁,该库具有类似的接口来boost 在Java中,JVM也为您完成了同样的操作。Java.lang.Object中内置了一个监视器。这就是用于锁定synchronized关键字的内容。JDK 6添加了一个并发包,为您提供了更细粒度的选择 这有一个很好的解释: 我很久没有写过C++了,所以我无法用这种语言来说明它。我上次写它时,它没有语言支持。我相信这都是第三方库或自定义代码。java.lang.Object内置了一个监视器。这就是用于锁定synchronized关键字的内容。JDK 6添加了一个并发包,为您提供了更细粒度的选择 这有一个很好的解释:我很久没有写过C++了,所以我无法用这种语言来说明它。我上次写它时,它没有语言支持。我相信这都是第三方库或自定义代码。它确实依赖于特定的锁定机制,通常是一个信号量,但您不能确定,因为它依赖于实现。它确实依赖于特定的锁定机制,通常是一个信号量,但您不能确定,因为它依赖于实现。锁定涉及一个同步原语,通常是一个互斥体。虽然天真地说,互斥体只是一个表示锁定或解锁的布尔标志,但问题在于细节:互斥体值必须以原子方式读取、比较和设置,以便多个线程尝试相同的互斥体时不会破坏其状态 但除此之外,指令必须正确排序,以便程序能够以正确的顺序看到互斥变量的读写效果,并且线程不会因为未能及时看到锁更新而意外进入关键部分 内存访问顺序有两个方面:一个是由编译器完成的,如果认为更有效,编译器可以选择对语句重新排序。这是相对容易防止的,因为编译器知道什么时候必须小心。更困难的现象是,CPU本身在内部可能会选择对指令进行重新排序,当访问互斥变量以进行锁定时,必须防止它这样做。这需要硬件支持,例如导致管道齐平和总线锁定的锁定位 最后,如果您有多个物理CPU,那么每个CPU都有自己的缓存,在任何执行指令取得进一步进展之前,将状态更新传播到所有CPU缓存变得非常重要。这同样需要专门的硬件支持
正如您所看到的,同步是一项潜在的昂贵业务,它实际上阻碍了并发处理。然而,这仅仅是拥有一个内存块所付出的代价,多个独立的上下文在该内存块上执行工作。锁定涉及一个同步原语,通常是一个互斥体。虽然天真地说,互斥体只是一个表示锁定或解锁的布尔标志,但问题在于细节:互斥体值必须以原子方式读取、比较和设置,以便多个线程尝试相同的互斥体时不会破坏其状态 但除此之外,指令必须正确排序,以便程序能够以正确的顺序看到互斥变量的读写效果,并且线程不会因为未能及时看到锁更新而意外进入关键部分 内存访问顺序有两个方面:一个是由编译器完成的,如果认为更有效,编译器可以选择对语句重新排序。这 由于编译器知道什么时候必须小心,所以要防止这种情况的发生相对来说是微不足道的。更困难的现象是,CPU本身在内部可能会选择对指令进行重新排序,当访问互斥变量以进行锁定时,必须防止它这样做。这需要硬件支持,例如导致管道齐平和总线锁定的锁定位 最后,如果您有多个物理CPU,那么每个CPU都有自己的缓存,在任何执行指令取得进一步进展之前,将状态更新传播到所有CPU缓存变得非常重要。这同样需要专门的硬件支持
正如您所看到的,同步是一项潜在的昂贵业务,它实际上阻碍了并发处理。然而,这仅仅是拥有一个内存块所付出的代价,多个独立的上下文在其上执行工作。我所知道的所有体系结构都使用原子来实现它们的同步原语。例如,请参阅,它在一些JDK版本中用于实现Semiphore和ReentrantLock 我所知道的所有体系结构都使用原子来实现它们的同步原语。例如,请参阅,它在一些JDK版本中用于实现Semiphore和ReentrantLock你应该把这个问题分成两个问题,一个关于java,一个关于C++。它们完全不同于C++中的C++与CPU指令的匹配,而实际的锁调用了像pthx这样的OS库。用java实例来研究非常低的东西。您应该把它分成两个问题,一个关于java,一个关于C++。在C++中,languages.AFAIK atomics与CPU指令完全不同,而实际的锁调用像pthx这样的OS库,用java示例来查看非常低级别的东西。我甚至没有意识到这一点,可能是因为boost在实现这些方面比stdlib供应商快得多。然后标准委员会用它来设计C++11标准。然后重新修改Boost.thread以模拟此设计。它确实是第一次向公众公开的……大概5年左右。thread不是std::thread,但它尽可能接近标准;我甚至没有意识到这一点,可能是因为boost在实现这些方面比stdlib供应商快得多。然后标准委员会用它来设计C++11标准。然后重新修改Boost.thread以模拟此设计。它确实是第一次向公众公开的……大概5年左右。Boost.thread不是std::thread,但它尽可能地接近它。@Java,好的,但监视器到底是什么?它是CPU等上的寄存器吗@Java,好的,但是监视器到底是什么?它是CPU等上的寄存器吗