当前位置: 首页 > 网络应用技术

如何保证Golang Sync / Atomic包的原子操作?

时间:2023-03-08 23:34:03 网络应用技术

  在GO语言标准库中,该软件包将底部硬件提供的原子级内存操作封装在GO的函数中。

  它由操作系统实现,原子包中的原子操作由底部硬件直接支持。在CPU实施的指令集中,某些指令直接封装在原子包中。在执行过程中,不允许这些说明中断。因此,CPU数量增加和线性扩展。

  在CPU执行过程中未中断的一个或多个操作称为原子。这些操作是作为不加区分的整体执行的。他们要么执行或不执行,而且外界不会看到他们只执行一半。可以使他们的中间状态是看不见的,然后我们可以Xuancheng认为他们具有“不可分割的”原子性。

  在GO中,普通的分配语句不是原子操作。在列中,32-位机上INT64类型的变量将具有中间状态,因为他将被拆卸为两个写作操作(MOV)-32 -The 32- 位和32-bit。

  原子操作由基础硬件支持,并且锁定是通过调度操作系统实现的。应该使用锁定来保护一部分逻辑。为了保护可变更新,原子操作通常更有效,并且可以使用计算机多核的优势。如果它是要更新的复合对象,则应使用包装。

  价值类型操作原子。值设计和实施

  除袋子外,其余的是在早期写的,该类型的基本实施也基于现有的袋子。

  Goroutine抓住了

  GO中场球员是GMP型号。简单地理解G是goroutine;M可以键入模拟内核线程,这是执行G的位置;在正常情况下,也可以指定数字的可用核心号码。

  附表规则:某个g不能总是占据M。在某个时间,运行时将确定当前的M是否可以扣押,即执行M上的G上的G。PSchedule g在合理的合理m处g到合理的m片刻。在运行时,每个p将G Queen localq.give g的本地存储保持在localq或globalq中的相应m执行。SO称为扣押,运行时将抓住G之外的G出来,将G的执行堆栈复制到执行队列中,它可能是P的LocalQ或GlobalQ的LocalQ,或GlobalQ,等待下一个计划,因此,当被扣押的G胶条recline ocle ge执行队列,P可能与此时的P运行相同。

  SO称为禁令是,当前的G在取消保费标记的禁令之前不允许扣押的调度。

  参考文章GO语言中文网站

  Atomic.Value在GO语言标准库中

  您不知道unsafe.pointer uintptr原理和游戏玩法

  了解GO1.13中Sync.pool的设计和实现

  GO SLICE的最大容量如何来自?

  Golang的Coroutial调度机制和GomaxProcs性能调整

  Golang同步:原子操作使用

  作者:眨眼