Golang并发数据结构-Golang

首页 2024-07-03 21:38:48

go 这种语言提供了两种并发数据结构:互斥体和读写锁:互斥体(sync.mutex):允许一次只有一个线程执行临界区域,以确保串行访问共享数据。读写锁(sync.rwmutex):允许多线程并发读取共享数据,但一次只能在共享数据中写一个线程,以提高读写效率。

Go 并发数据结构在语言中的实现

并发数据结构在多线程应用程序中非常重要,它们可以确保多线程能够安全高效地访问共享数据。Go 语言提供了丰富的并发数据结构,本文将介绍如何实现两种常用的并发数据结构:互斥体读写锁

互斥体

互斥体是一种同步原语,允许一次只执行一个临界区域的线程。在 Go 可用于语言 sync.Mutex 实现互斥体的类型。

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    cnt := 0

    // 创建一个 goroutine 增加计数器
    go func() {
        mu.Lock()
        defer mu.Unlock()
        cnt  
        fmt.Println("goroutine increased the counter to", cnt)
    }()

    // 主 goroutine 等待 goroutine 完成
    mu.Lock()
    fmt.Println("main goroutine <a style='color:#f60; text-decoration:underline;' href="https://www.php.cn/zt/16380.html" target="_blank">access</a>ed the counter", cnt)
    mu.Unlock()
}

这个例子中,mu.Lock() 会阻塞主 goroutine 直到它获得互斥锁,然后 goroutine 可执行临界区(增加计数器)。一旦 goroutine 完成后,它将释放锁,允许主 goroutine 访问计数器。

立即学习“go语言免费学习笔记(深入);

读写锁

读写锁是一种更先进的同步原语,允许多线程并读取共享数据,但一次只能在共享数据中写一个线程。在 Go 可用于语言 sync.RWMutex 实现读写锁的类型。

import (
    "fmt"
    "sync"
)

func main() {
    var rwlock sync.RWMutex
    cnt := 0

    // 创建两个 goroutine 读取计数器
    for i := 0; i < 2; i   {
        go func(i int) {
            rwlock.RLock()
            defer rwlock.RUnlock()
            fmt.Println("goroutine", i, "read the counter", cnt)
        }(i)
    }

    // 主 goroutine 等待读取器完成
    for i := 0; i < 2; i   {
        rwlock.Lock()
        defer rwlock.Unlock()
        cnt  = i
        fmt.Println("main goroutine increased the counter to", cnt)
    }
}

在这个例子中,多个 goroutine 读锁可以同时用来读取计数器,而主 goroutine 在写入计数器之前,它会被堵塞(持有写锁)。这可以确保多个读取器和一个写入器能够安全地访问共享数据。

以上就是golang并发数据结构实现的详细内容,更多请关注其它相关文章!


p