当需要有一个全局性的map集合资源进行增删改数据时,需要对该map资源增加读写锁,防止并发时出现安全问题

下面的类就是举例 , 属性中的Conns模拟存储一些资源,对这些资源进行并发的增加数据,使用写锁锁住资源,当读取是使用读锁锁住资源

  1. package snet
  2.  
  3. import "sync"
  4.  
  5. import "errors"
  6.  
  7. type ConnManger struct {
  8. Conns map[uint32]string
  9. ConnLock sync.RWMutex
  10. }
  11.  
  12. func NewConnManger() *ConnManger {
  13. cm := &ConnManger{
  14. Conns: make(map[uint32]string),
  15. }
  16. return cm
  17. }
  18. func (cm *ConnManger) Add(id uint32, value string) {
  19. cm.ConnLock.Lock()
  20. defer cm.ConnLock.Unlock()
  21. cm.Conns[id] = value
  22. }
  23. func (cm *ConnManger) Remove(id uint32) {
  24. cm.ConnLock.Lock()
  25. defer cm.ConnLock.Unlock()
  26. delete(cm.Conns, id)
  27. }
  28. func (cm *ConnManger) Get(id uint32) (string, error) {
  29. cm.ConnLock.RLock()
  30. defer cm.ConnLock.RUnlock()
  31. conn, ok := cm.Conns[id]
  32. if !ok {
  33. return "", errors.New("connmanager get conn error ")
  34. }
  35. return conn, nil
  36. }
  37. func (cm *ConnManger) Len() int {
  38. return len(cm.Conns)
  39. }
  40. func (cm *ConnManger) Clean() {
  41. cm.ConnLock.Lock()
  42. defer cm.ConnLock.Unlock()
  43. for key, _ := range cm.Conns {
  44. delete(cm.Conns, key)
  45. }
  46. }

使用时

  1. package main
  2.  
  3. import "single/snet"
  4.  
  5. import "log"
  6.  
  7. import "sync"
  8.  
  9. import "strconv"
  10. func main() {
  11. cm:=snet.NewConnManger()
  12. var wg sync.WaitGroup
  13. for i:=;i<;i++{
  14. go func(i uint32){
  15. defer wg.Done()
  16. wg.Add()
  17. cm.Add(i,"连接"+strconv.Itoa(int(i)))
  18. }(uint32(i))
  19. }
  20. wg.Wait()
  21. log.Println(cm.Len())
  22. for key,value:=range cm.Conns{
  23. log.Println(key,value)
  24. }
  25. cm.Clean()
  26. log.Println(cm.Len())
  27. select{}
  28. }

[Go] 使用读写锁对map资源进行安全处理的更多相关文章

  1. 深刨显式锁ReentrantLock原理及其与内置锁的区别,以及读写锁ReentrantReadWriteLock使用场景

    13.显示锁 在Java5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile.Java5.0增加了一种新的机制:ReentrantLock.与之前提到过的机 ...

  2. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  3. C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题

    (补充:初始化FileStream时使用包含文件共享属性(System.IO.FileShare)的构造函数比使用自定义线程锁更为安全和高效,更多内容可点击参阅) 在开发程序的过程中,难免少不了写入错 ...

  4. 读者写者问题继 读写锁SRWLock

    在<秒杀多线程第十一篇读者写者问题>文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一 ...

  5. pthread_rwlock_t读写锁函数说明

    读写锁 索引: 初始化一个读写锁pthread_rwlock_init 读锁定读写锁      pthread_rwlock_rdlock 非阻塞读锁定 pthread_rwlock_tryrdloc ...

  6. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  7. 多线程面试题系列(14):读者写者问题继 读写锁SRWLock

    在第十一篇文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题.问题虽然得到了解决,但代码有点复杂.本篇将介绍一种新方法--读写锁SRWLock来解决这一问题.读写锁在对资源进行保护的同时,还 ...

  8. C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

    http://www.jb51.net/article/99718.htm     本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...

  9. UNIX环境高级编程——线程同步之读写锁以及属性

    读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...

随机推荐

  1. ssh隧道详解与案例利用讲解

    原文阅读:https://www.52stu.org/?p=206 你是否有过自己身处内网,却想整个远控上线?你是否有过身处目标内网,却想把目标的内网的Linux的ssh转发出来?你是否想过穿透多层网 ...

  2. 【DSP开发】【并行计算-CUDA开发】TI OpenCL v01.01.xx

    TI OpenCL v01.01.xx TI OpenCL™ Runtime Documentation Contents: Introduction OpenCL 1.1 Reference Mat ...

  3. sqlalchemy orm的cascade的参数

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text ...

  4. [转帖]运行时库(runtime library)

    运行时库(runtime library) https://blog.csdn.net/xitie8523/article/details/82712105 没学过这些东西 或者当时上课没听 又或者 ...

  5. mysql拆分逗号一列变多行

    需求: SELECT ), ) FROM TABLE a INNER JOIN mysql.help_topic b )

  6. Ubuntu19.04系统SSH连接CentOS7虚拟机

    一.为CentOS7配置静态IP 注意查看宿主机(Ubuntu19.04)所在局域网段,当前为172.18.25.108 修改当前系统下virtual box的网络设置 [控制]-->[设置]- ...

  7. MYSQL中的UNION和UNION ALL

    SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...

  8. Codeforces 1229B. Kamil and Making a Stream

    传送门 注意到只要考虑祖先和后代之间的贡献 发现对于一个节点,他和所有祖先最多产生 $log$ 个不同的 $gcd$ 所以每个节点开一个 $vector$ 维护祖先到自己所有不同的 $gcd$ 和这个 ...

  9. Encryption (hard) CodeForces - 958C3 (树状数组)

    大意: 给定序列$a$, 要求将$a$分成$k$个非空区间, 使得区间和模$p$的和最小, 要求输出最小值. $k$和$p$比较小, 直接暴力$dp$, 时间复杂度是$O(nklogp)$, 空间是$ ...

  10. 通过设置访问密码查看Tomcat服务器运行状态

    安装tomcat 设置访问manager用户名,密码 vim /usr/local/tomcat9/conf/tomcat-users.xml # 设置访问manager用户名,密码 # 在倒数第二行 ...