wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了windows – 如何理解获取和释放语义?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我从MSDN中找到了三个函数,如下: 1.InterlockedDecrement(). 2.InterlockedDecrementAcquire(). 3.InterlockedDecrementRelease(). 我知道那些函数用于将值减少为原子操作,但我不知道这三个函数之间的区别 (um… but don’t ask me what does it mean exactly) 我会捅
我从MSDN中找到了三个函数,如下:

1.InterlockedDecrement().

2.InterlockedDecrementAcquire().

3.InterlockedDecrementRelease().

我知道那些函数用于将值减少为原子操作,但我不知道这三个函数间的区别

解决方法

我会捅那个.

需要记住的是,编译器或cpu本身可能会重新排序内存读取和写入,如果它们看起来不相互处理.

这很有用,例如,如果你有一些代码可能正在更新结构:

if ( playerMoved ) {
  playerPos.X += dx;
  playerPos.Y += dy; 

  // Keep the player above the world's surface.
  if ( playerPos.Z + dz > 0 ) {
     playerPos.Z += dz;
  }
  else {
     playerPos.Z = 0;
  }
}

上述大多数语句可能会重新排序,因为它们之间没有数据依赖关系,实际上,超标量cpu可能会同时执行大多数语句,或者可能会更快地开始处理Z段,因为它不会影响X或Y,但可能需要更长时间.

这是问题所在 – 让我们说你正在尝试无锁编程.你想要执行一大堆内存写入,也许,填写一个共享队列.你终于写下了一面旗帜,表明你已经完成了.

好吧,由于该标志似乎与正在完成的其余工作无关,编译器和cpu可能会对这些指令重新排序,现在您可以在实际提交其余部分之前设置“完成”标志.结构到内存,现在你的“无锁”队列不起作用.

这就是Acquire和Release排序语义发挥作用的地方.我通过使用Acquire语义设置一个标志左右来设置我正在做的工作,并且cpu保证我在该指令之后播放的任何记忆游戏实际上都低于该指令.我设置我已经完成了设置一个标志左右的Release语义,并且cpu保证我在发布之前所做的任何记忆游戏实际上都在发布之前.

通常,人们会使用显式锁 – 互斥锁,信号量等来做到这一点,其中cpu已经知道它必须注意内存排序.尝试创建“无锁”数据结构的关键是提供线程安全的数据结构(对于某些线程安全的含义),它们不使用显式锁(因为它们非常慢).

不支持获取/发布排序语义的cpu或编译器上可以创建无锁数据结构,但它通常意味着使用一些较慢的内存排序语义.例如,您可以发出一个完整的内存屏障 – 在此指令之前必须实际提交的所有内容都必须在此指令之前提交,并且此指令之后的所有内容必须在此指令之后实际提交.但这可能意味着我等待早期在指令流(可能是函数调用序言)中的一堆实际上无关的内存写入与我试图实现的内存安全无关.

Acquire说“只关心我后面的东西”.发布说“只担心我面前的事情”.将两者结合起来是一个完整的记忆障碍.

大佬总结

以上是大佬教程为你收集整理的windows – 如何理解获取和释放语义?全部内容,希望文章能够帮你解决windows – 如何理解获取和释放语义?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。