在本文中,让我们详细讨论该语言的原子操作的用法。什么是原子操作?顾名思义,原子操作是一个原子操作...是否觉得与之相同,原子解释如下:
在CPU执行过程中未中断的一个或多个操作称为原子。这些操作是作为不加区分的整体执行的。他们要么表演或不执行,而且外界不会看到他们只执行一半。
执行一系列操作是不可能中断的,但是如果我们执行多次操作,它们可以使他们的中间状态是看不见的,那么我们可以声明它们具有“ Unspeed”的原子性。
在数据库事务的概念中也听到了类似的解释,但在这里确保原子执行。
该语言通过构建的包装提供了对原子操作的支持。其提供的原子操作具有以下类别:
在工作日,在同时编程中,GO语言包中的同步原始性通常用于确保并发安全。那么,我认为这些操作的这些操作有什么区别?它们与使用的目的和底层不同:
为了保护可变更新,原子操作通常更有效,并且可以使用计算机多核的优势。
例如,以下内容使用相互锁定并发数字:
更改对方法的更改仍然可以确保变量不锁定的并发性增加。
您可以在本地运行这两个代码,并且可以在末端观察到计数器的结果,这些结果都是螺纹的。
应该注意的是,所有原子操作方法的操作数必须是指针的类型。通过指针变量,您可以在内存中获取操作号码的地址,以便应用特殊的CPU指令,以确保只有一个Goroutine可以同时同时运行。
除了增加操作外,我们还展示了加载操作。接下来,让我们看一下操作。
此操作称为比较和交换。此类操作的前缀为:
操作的值首先确保在交换之前不会更改操作的值在数据库中看到。
应该注意的是,当大量的goroutine在变量上读取和写操作时,可能会导致操作失败。目前,您可以使用该周期尝试多次。
我仅列出了上面更典型和类型的方法。主要原因是说,除了阅读值类型以进行比较外,它还支持比较交换。
unsafe.pointer提供了一种绕过GO语言指针类型限制的方法。不安全的是不是说这是不安全的,而是官员不能保证兼容性倒退。
上面的示例未在并发环境中进行,只是为了证明效果,首先设置操作数量。
实际上,基础实施也依赖于原子操作的实施。原子操作的软件包等效于实现包装中同步原语。
例如,相互锁定结构中有一个字段,这意味着锁定状态的状态位置。
为了促进理解,我们将其状态定义为0和1,而0表示当前锁定。1意味着它已被锁定。以下是实施代码方法的一部分。
在中间,锁的状态通过方法确定锁定此时是否为idle(),是的,然后锁定锁定(常数的值为1)。
该包提供了一组开始,以确保在修改变量的过程中读取各种类型的变量的同时编写,并避免其他操作读取肮脏的数据。
这些操作方法的定义与上面介绍的那些方法相似,因此我将不再演示如何使用这些方法。
值得一提的是,如果要设置安全设置的结构的多个字段,除了将结构转换为指针外,还可以使用稍后介绍的软件包。指针类型之间的转换。
之后,它使我们能够依靠不保证兼容性的类型,同时,我们可以将任何数据类型的读写操作封装在原子操作中(中间状态不可见)。
公开类型的两种方法:
我想我还添加了一种版本1.17的方法。
简单的接口使其有用。只需阅读并分配有价值的操作以及更换需要进行的变量即可。
由于返回的类型是一种类型,因此我们记得在使用它之前将其转换为特定的值类型。BELOW是演示的简单示例。
您也可以尝试,无需直接为类型指针变量分配值。查看在并发条件下,这两个字段的值是否可以将两个字段的值转换为10和15。
它已被更好的方法所取代,我觉得这确实是不必要的。阅读本文的内容后,我相信您有能力探索包裹。
在重点上,原子操作得到了底部硬件的支持,而锁定是通过调度操作系统实现的。应该使用锁定锁定逻辑。为了保护可变更新,原子操作通常更有效,并且可以使用计算机多核的优势。如果它是要更新的复合对象,则应使用包装。
作者:Kevinyan