Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++(可能是java)如何锁定对象进行同步? 当对象被锁定在C++和java语言中,实际上是在低级别的范围内执行的?我认为这与CPU/缓存或RAM无关。我最好的估计是,这发生在操作系统的某个地方?它会在执行上下文切换的操作系统的同一部分中吗_Java_C++_Synchronization_Locking - Fatal编程技术网

C++(可能是java)如何锁定对象进行同步? 当对象被锁定在C++和java语言中,实际上是在低级别的范围内执行的?我认为这与CPU/缓存或RAM无关。我最好的估计是,这发生在操作系统的某个地方?它会在执行上下文切换的操作系统的同一部分中吗

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

我指的是锁定对象、在Java方法签名上同步等等


<> 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