gpt4 book ai didi

Golang实现对map的并发读写的方法示例

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Golang实现对map的并发读写的方法示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

在Golang多协程的情况下使用全局map时,如果不做线程同步,会出现panic的情况.

为了解决这个问题,通常有两种方式:

  • 第一种是最常见的使用互斥锁或者读写锁的方法;
  • 第二种是比较符合Golang特色的方法,启动单个协程对map进行读写,当其他协程需要读写map时,通过channel向这个协程发送信号即可。

写了一个模拟程序对map中的一项进行读或者写,后台一直运行的协程阻塞的接受读写信号,并对map进行操作,但是读操作的时候没想好怎么返回这个值.

后来想到用传引用的方式,定义结构体,第一个参数是读写的标志,第二个参数是读成功或者写成功后的值的channel,定义的channel中传结构体指针.

ps:以后验证一下效率。简单封装了一下:http://www.zzvips.com/article/68663.html 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package main
 
import (
  "fmt"
  "strconv"
  "time"
)
 
type value struct {
  id int
  op int
  ret chan int
}
var dic map[int]int
var ch chan *value
 
func readAndWrite2Map() {
  for {
  select{
  case flag := <- ch:
 
   if flag.op > 0 {
   log.Printf("id: %v, op: %v, ret: %v", flag.id, flag.op, flag.op)
   dic[1] = flag.op
   flag.ret <- dic[1]
   } else if flag.op == 0 {
   log.Printf("id: %v, op: %v, ret: %v", flag.id, flag.op, dic[1])
   flag.ret <- dic[1]
   } else {
   return
   }
  }
  }
}
 
 
func out(flag, i, val int) {
  if flag == 0 {
  fmt.Println(strconv.Itoa(i) + "th goroutine read the value is ", val)
  } else {
  fmt.Println(strconv.Itoa(i)+"th goroutine write to the map ", val)
  }
}
 
func main() {
  dic = make(map[int]int)
  ch = make(chan *value)
  dic[1] = -1
  go readAndWrite2Map()
  for i := 0; i <= 5; i++ {
  if (i % 2) == 0 {
   go func(i int) {
    var tmp value
    for {
    tmp.op = 0
    ch <- &tmp
    out(0, i, <-tmp.ret)
    time.Sleep(time.Millisecond)
    }
   }(i)
 
  } else {
   go func(i int) {
    var tmp value
    for {
    tmp.op = i
    ch <- &tmp
    out(1, i, <-tmp.ret)
    time.Sleep(time.Millisecond)
 
    }
   }(i)
  }
  }
  time.Sleep(time.Second * 60)
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://blog.csdn.net/liyunlong41/article/details/82958971 。

最后此篇关于Golang实现对map的并发读写的方法示例的文章就讲到这里了,如果你想了解更多关于Golang实现对map的并发读写的方法示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com