主页 > 知识库 > Golang实现对map的并发读写的方法示例

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

热门标签:地图标注的汽车标 高德地图标注口诀 江西转化率高的羿智云外呼系统 广州呼叫中心外呼系统 西部云谷一期地图标注 学海导航地图标注 浙江高速公路地图标注 南通如皋申请开通400电话 中国地图标注省会高清

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

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

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

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

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

ps:以后验证一下效率。简单封装了一下:https://www.jb51.net/article/157620.htm

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)
}

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

您可能感兴趣的文章:
  • Golang Map实现赋值和扩容的示例代码
  • golang中range在slice和map遍历中的注意事项
  • golang 并发安全Map以及分段锁的实现方法
  • golang线程安全的map实现
  • golang中sync.Map并发创建、读取问题实战记录
  • golang如何实现mapreduce单进程版本详解
  • Golang map如何生成有序的json数据详解
  • golang针对map的判断,删除操作示例
  • 理解Golang中的数组(array)、切片(slice)和map
  • Golang 使用map需要注意的几个点

标签:曲靖 常州 贵州 保定 许昌 东营 吐鲁番 德宏

巨人网络通讯声明:本文标题《Golang实现对map的并发读写的方法示例》,本文关键词  Golang,实现,对,map,的,并发,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《Golang实现对map的并发读写的方法示例》相关的同类信息!
  • 本页收集关于Golang实现对map的并发读写的方法示例的相关信息资讯供网民参考!
  • 推荐文章