• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Golang实现对map的并发读写的方法示例

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

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

    写了一个模拟程序对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以及分段锁的实现方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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