当前位置: 首页 > 工具软件 > go-spacemesh > 使用案例 >

go map sync RWMutex

姬魁
2023-12-01

go map类似python字典
map是引用类型因此使用的时候需要先定义,比如用make 开辟一段空间。

map并发读写是存在问题的,就是我正在读的元素可能正在被修改那抹我读的就是错的,因此在map读写的时候需要加锁。
不加锁报错

package main

import (
	"fmt"
	"sync"
)

var Mutex sync.Mutex

var Map = make(map[string]int, 20)

func writeMap() {
	for i := 0; i < 500; i++ {
		key := fmt.Sprintf("stu_%d", i)
		Map[key] = i
	}
}

func readMap() {
	for i := 0; i < 50; i++ {
		key := fmt.Sprintf("stu_%d", i)
		v, ok := Map[key]
		if ok {
			fmt.Printf("key : %s value: %d", key, v)
		} else {
			fmt.Println("nopt exist")
		}
	}
}

func main() {
	fmt.Println("test")
	go readMap()
	go writeMap()
	for {
	}
}

报错如下:
fatal error: concurrent map read and map write

修改如下通过读写锁,读锁之间可以并行,但是写锁不能并行写,读与写互斥

package main

import (
	"fmt"
	"sync"
)

var Mutex sync.RWMutex

var Map = make(map[string]int, 20)

func writeMap() {
	
	for i := 0; i < 10; i++ {
	Mutex.Lock()
		key := fmt.Sprintf("stu_%d", i)
		Map[key] = i
	Mutex.Unlock()
	}

}

func readMap(id int) {
	
	for i := 0; i < 5; i++ {
		Mutex.RLock()
		key := fmt.Sprintf("stu_%d", i)
		v, ok := Map[key]
		if ok {
			fmt.Printf("thread 为  %d 读取到 key : %s value: %d\n", id, key, v)
		} else {
			fmt.Println("not exist\n")
		}
		Mutex.RUnlock()
	}
	
}

func main() {
	fmt.Println("test")
	go writeMap()
	go readMap(1)
	go readMap(2)
	go readMap(3)
	for {
	}
}

打印结果如下

thread 为  3 读取到 key : stu_0 value: 0
thread 为  3 读取到 key : stu_1 value: 1
thread 为  3 读取到 key : stu_2 value: 2
thread 为  3 读取到 key : stu_3 value: 3
thread 为  3 读取到 key : stu_4 value: 4
thread 为  1 读取到 key : stu_0 value: 0
thread 为  2 读取到 key : stu_0 value: 0
thread 为  2 读取到 key : stu_1 value: 1
thread 为  2 读取到 key : stu_2 value: 2
 类似资料:

相关阅读

相关文章

相关问答