Golang atomic.AddUintptr()函数及示例

Golang atomic.AddUintptr()函数及示例

在Go语言中,atomic包提供了较低级别的原子内存,有助于实现同步算法。Go语言中的 AddUintptr() 函数用于自动将delta添加到*addr中。该函数在atomic包中定义。在这里,您需要导入“sync/atomic”包才能使用这些函数。

语法:

func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)

在这里,addr表示地址,delta表示大于零的小比特数。

注意:(*uintptr)是uintptr值的指针。而uintptr是足够大且可以容纳任何指针的比特模式的整数类型。

返回值:它会自动添加addr和delta并返回一个新值。

示例1:

// Golang程序演示了AddUintptr函数的用法

// 包含主包
package main

// 导入fmt和sync/atomic
import (
    "fmt"
    "sync/atomic"
)

// 主函数
func main() {

    // 为uintptr分配变量值
    var (
        w uintptr = 0
        x uintptr = 255
        y uintptr = 564688
        z uintptr = 656757686877
    )

    // 为uintptr分配常量值
    const (
        m uintptr = 78
        n uintptr = 96
    )

    // 用其参数调用AddUintptr方法
    p_1 := atomic.AddUintptr(&x, (m))
    p_2 := atomic.AddUintptr(&y, ^(n - 1))
    p_3 := atomic.AddUintptr(&z, (2))
    p_4 := atomic.AddUintptr(&w, (n - m))

    // 在自动添加addr和delta后显示输出
    fmt.Println(p_1)
    fmt.Println(p_2)
    fmt.Println(p_3)
    fmt.Println(p_4)
}

输出:

333
564592
656757686879
18

示例2:

// Golang程序演示了AddUintptr函数的用法

// 包含主包
package main

// 导入fmt和sync/atomic
import (
    "fmt"
    "sync/atomic"
)

// 定义类型为uintptr的addr
type addr uintptr

// 函数添加addr和delta
func (p *addr) adds() uintptr {

    // 调用AddUintptr()函数及其参数
    return atomic.AddUintptr((*uintptr)(p), 32686776785)
}

// 主函数
func main() {

    // 定义p
    var p addr

    // 循环增加p的值
    for i := 4; i < 1000; i *= 5 {

        // 显示添加delta和addr后的新值
        fmt.Println(p.adds())
    }
}

输出:

32686776785
65373553570
98060330355
130747107140

在上面的示例中,我们定义了一个函数adds,该函数返回从调用AddUintptr方法返回的输出。在主函数中,我们定义了一个“for”循环,该循环将在每次调用中增加‘p’的值。这里,AddUintptr()方法的第二个参数是常量,仅第一个参数的值是可变的。但是,前一次调用的输出将是下一次循环调用AddUintptr()方法的第一个参数的值,直到循环结束。

看看上面的示例如何工作:

第一参数= 0,第二参数= 32686776785 //返回(0 + 32686776785 = 32686776785)

//现在,以上输出是下一次调用AddUintptr()方法的第一个参数
//它返回(32686776785 + 32686776785 = 65373553570)
第一参数= 32686776785,第二参数= 32686776785

//返回(65373553570 + 32686776785 = 130747107140)等等
第一参数= 65373553570,第二参数= 32686776785

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程