温馨提示×

golang多线程共享变量怎么实现

小亿
108
2023-10-25 17:53:40
栏目: 编程语言

在Go语言中,可以使用sync包中的MutexRWMutex来实现多线程之间共享变量的访问控制。

Mutex是一种互斥锁,可以使用LockUnlock方法来控制对共享变量的读写访问。在使用Lock方法之前,需要先获取锁,然后再使用Unlock方法来释放锁。

import (
    "sync"
)

var (
    mu sync.Mutex
    count int
)

func main() {
    go increment()
    go increment()

    // 等待所有goroutine执行完成
    time.Sleep(time.Second)

    fmt.Println("count:", count)
}

func increment() {
    for i := 0; i < 100000; i++ {
        mu.Lock()
        count++
        mu.Unlock()
    }
}

RWMutex是一种读写锁,支持多个goroutine同时读取共享变量,但只能有一个goroutine进行写操作。可以使用RLockRUnlock方法来获取和释放读锁,使用LockUnlock方法来获取和释放写锁。

import (
    "sync"
)

var (
    mu sync.RWMutex
    count int
)

func main() {
    go read()
    go read()
    go write()

    // 等待所有goroutine执行完成
    time.Sleep(time.Second)

    fmt.Println("count:", count)
}

func read() {
    for i := 0; i < 100000; i++ {
        mu.RLock()
        _ = count
        mu.RUnlock()
    }
}

func write() {
    for i := 0; i < 100000; i++ {
        mu.Lock()
        count++
        mu.Unlock()
    }
}

在使用sync.Mutexsync.RWMutex时,需要注意以下几点:

  • 使用LockRLock方法获取锁时,如果锁已经被其他goroutine占用,则当前goroutine会阻塞等待锁释放。
  • 在释放锁之前,需要确保已经完成了对共享变量的读写操作,避免出现数据不一致的情况。
  • 可以使用defer语句来确保在函数返回时释放锁,避免忘记释放锁导致死锁的问题。

0