在并发环境中从地图中删除是否安全?在戈兰

2024-02-17

我是否需要在从地图上删除该项目之前先上锁?

package main

import ( 
    "errors"
    "sync"
    "time"
)

type A struct {
    Error error
}

func (a *A) Job() {
//    ... more job
}

var l sync.RWMutex

func generate() {
    l.Lock()
    values["key1"] = A{}
    l.Unlock()
    l.Lock()
    values["key2"] = A{}
    values["key3"] = A{}
    l.Unlock()
 //   ...
    l.Lock()
    values["key1919"] = A{Error: errors.New("oh...")}
    l.Unlock()
 //   ...
    l.Lock()
    values["key99999999999"] = A{}
    l.Unlock()
}

var values map[string]A

func main() {
    values = make(map[string]A)
    go generate()

    for {
        l.RLock()
        for key, value := range values {
            if value.Error != nil {
                delete(values, key)    // it's safe? or you need to take a lock?
            } else {
                value.Job()
            }   
        }
        l.RUnlock()
        time.Sleep(10 * time.Second)
    }
}

变种:

  1. 范围内删除不用担心

  2. 在切片中添加键并单独范围以删除它们

  3. l.RUNlock(); l.Lock();删除(值,键); l.解锁; l.RLock();在范围内

  4. go l.delete(key) // gorutin 启动

哪个变体是通过锁定/解锁有效删除的?


从映射中删除被视为写入操作,并且必须与所有其他读取和写入序列化。如果我正确理解你的问题,那么是的,你需要稍后批量删除,或者放弃读锁并采取写锁来完成删除。

运行时尝试检测并发读取和写入,并将因以下原因之一而崩溃:

fatal error: concurrent map writes
fatal error: concurrent map read and map write
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在并发环境中从地图中删除是否安全?在戈兰 的相关文章

  • 在 OSX 上交叉编译 Go?

    我正在尝试在 OSX 上交叉编译 go 应用程序以构建适用于 Windows 和 Linux 的二进制文件 我已经阅读了网上能找到的所有内容 我发现的最接近的例子已经发布在 除了疯狂邮件列表上许多未完成的讨论之外 http solovyov
  • 无法在 Golang 中导入本地模块

    我正在尝试导入本地模块 但无法使用以下命令导入它go mod 我最初使用以下方式构建了我的项目go mod init github com AP Ch2 GOMS 注意我的环境是go1 14我使用 VSCode 作为我的编辑器 这是我的文件
  • go build 不断抱怨:go.mod 有 post-v0 模块路径

    Go 1 11 发布后 我一直在尝试将我的存储库移动到 Go 模块 方法是添加go mod文件在其根目录下 我的根库之一my host root其版本为17 0 1 所以我在其中写道go mod file module my host ro
  • 带有导出字段的私有类型

    在 Go 教程的第二天有这样的练习 为什么拥有带有导出字段的私有类型会很有用 例如 package geometry type point struct X Y int name string 请注意point是小写的 因此不会导出 而字段
  • 修改现有的yaml文件并添加新的数据和注释

    我最近看到了yaml https github com go yaml yaml tree v3lib 有新版本 V3 与nodes https github com go yaml yaml blob v3 yaml go L348功能
  • 如何使用 golang 和 mgo 库在 mongodb 中创建文本索引?

    我正在尝试对集合进行全文搜索 但为了做到这一点 我需要创建一个文本索引 http docs mongodb org manual tutorial create text index on multiple fields http docs
  • java.lang.NoSuchMethodError:com.fasterxml.jackson.databind.type。使用 apache beam Spark runner 运行 go 示例时

    我想跑grades https github com apache beam tree master sdks go examples gradesapache beam go sdk 提出的示例 在一个主服务器和两个从服务器 spark2
  • go 中的属性更改通知

    如何在 go 中向多个接收器发出 属性 更改信号 类似于在 Qt 中使用通知信号定义属性的方式 例如 如果您想象有一些值需要以多种方式显示 例如进度值可以同时显示为进度条和文本 当基础值发生变化时 两者都需要更新 一种方法可能是利用chan
  • Go MSSQL 连接

    如何提供 MSSQL 连接 它说它始终与代码相关 即使信息不正确 也不会报错 package main import database sql fmt github com denisenkom go mssqldb log var ser
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • 如何在 Go 中表示可选字符串?

    我希望建模一个可以有两种可能形式的值 不存在或字符串 执行此操作的自然方法是Maybe String or Optional
  • 如何在 Goji (Golang) 中使用不同的中间件创建单独的路由组?

    我正在使用Goji https github com zenazn goji https github com zenazn goji 并希望定义具有自己的中间件的路由组 例如 下面的所有路径 company应使用 LDAP 身份验证并定义
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • 是否支持动态变量?

    我想知道Go中是否可以动态创建变量 我在下面提供了一个伪代码来说明我的意思 我将新创建的变量存储在切片中 func method slice make type for i 0 i lt 10 i var variable i i slic
  • 按引用或按值扫描功能

    我有以下代码 statement SELECT id from source where mgmt 1 var exists string errUnique dr db QueryRow statement mgmt Scan exist
  • Golang 基础知识 struct 和 new() 关键字

    我正在学习 golang 当我阅读描述结构的章节时 我遇到了初始化结构的不同方法 p1 passport var p2 passport p3 passport Photo make byte 0 0 Name Scott Surname
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 如何在 Golang 中将 []byte XML 转换为 JSON 输出

    有没有办法在 Golang 中将 XML byte 转换为 JSON 输出 我有以下功能body is byte但我想在一些操作之后将此 XML 响应转换为 JSON 我试过了Unmarshal in xml打包没有成功 POST func
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器

随机推荐

  • 如何在启动时启动 Docker for Mac 守护进程?

    我想让 Docker for Mac 在启动时启动 而不是在登录时启动 我该怎么做呢 我想创建一个LaunchDaemon 我只是不知道要启动什么程序 我看到的所有例子似乎都使用docker machine定义一个虚拟机 但文档现在说doc
  • 简短的Python代码来表达“选择较低的值”?

    我的意思是 我正在寻找返回较低值的非常短的代码 例如 a 1 2 3 4 5 6 7 8 9 10 b 1 2 3 4 5 6 7 8 len a 10 len b 8 if fill this in print lesser value
  • 使用 QNetworkAccessManager 的 post() 方法上传文件

    我在使用 Qt 应用程序时遇到一些问题 特别是 QNetworkAccessManager 类 我正在尝试使用 QNetworkAccessManager 的 post 方法执行二进制文件的简单 HTTP 上传 文档指出我可以为 post
  • 在标头中发送会话密钥与仅 HTTP cookie

    我想知道在我的系统中发送会话密钥的最佳选择 在我的系统中 有一个 API 服务器可供 Web 浏览器 命令行界面和桌面应用程序使用 它通过查看用户的身份来验证用户的身份AuthorizationHTTP 标头 目前 浏览器将会话密钥存储在
  • CodeIgniter 和 SimpleTest——如何进行我的第一个测试?

    我习惯使用 LAMP PHP5 MySQL 以及带有 Xdebug 的 NetBeans 进行 Web 开发 现在我想通过学习如何使用 A 正确的测试和 B 框架来改进我的开发 所以我设置了 CodeIgniter SimpleTest 和
  • 使用模拟库在循环中进行用户输入的 Python 测试

    我正在尝试使用模拟库来测试一段代码 在此代码中 用户原始输入在 for 循环中被接受 如下所示 我已经写了测试用例test apple record可以为托盘编号提供单个用户输入值 但是 对于 for 循环中的每次迭代 它只采用与预期相同的
  • 直接管理 + Docker

    我有 Direct Admit 的 VPS 托管 有 Debian Jessie 我可以使用 ssh 现在我想使用 docker 容器安装 discourse 我应该做一些超出手册提示内容的事情吗 我是说 我对港口一无所知 例如 直接管理使
  • 获取 URL 的基本名称,然后将活动类放入导航栏

    示例链接 http localhost test page php 我有一段 JavaScript 代码 它将放置一个active导航栏的类 如果该导航栏的 url href current url 当前的 JavaScript 仅将活动类
  • 通过簇替换重新采样

    我想绘制簇 由变量定义id 从数据集中进行替换 与之前回答的问题相比 我希望选择 K 次的聚类以使每个观察重复 K 次 也就是说 我正在进行集群引导 例如 以下示例id 1两次 但重复观察id 1仅在新数据集中出现一次s 我想要所有的观察结
  • 使用平铺进行透视图像转换

    在寻找一个可以用于我计划创建的新应用程序的良好图像处理库 我将使用 C NET VS 2008 我的应用程序需要执行以下操作 在启动时加载图像并将其显示在图片框中 然后我应该能够在图片框中的任何位置选择四个点 左上 右上 左下 右下 然后
  • 这是在java中声明记录器变量的最佳方法

    我只是想知道在 java 中声明记录器变量的最佳方法是什么 以下是一些声明 1 gt private static final Logger logger Logger getLogger ServiceImpl class 2 gt pr
  • 如何在c中找到内存分配的最大限制

    我想确定我可以在计算机中分配的最大内存限制是多少 这是我为此任务编写的代码 include
  • 使用 win32inet.WinHttpGetProxyForUrl 的正确方法是什么

    我正在尝试使用 Win32com 开发人员公开的 Microsoft WinHttp 库的一项功能 不幸的是 大多数库似乎没有文档记录 并且没有通过 win32com 库使用 win32inet 功能的正确方法的示例 这是我到目前为止所拥有
  • 有没有办法一次性清除表单中的所有字段?

    我刚刚开始学习 C 我想知道是否可以清除所有文本框的内容 例如我的表单中的内容 我知道如何一一清除 但这对我来说不实用 thanks 编辑 我找到了答案 非常感谢大家 您可以使用以下循环来清除活动表单中的所有文本框对象 foreach Co
  • 在Unity中使用动态关键字/.NET 4.6功能

    我正在尝试将 GraphQL 实现到 Unity3D 版本 2017 1 0f3 Personal 中 我正在使用 NET 4 6 实验版 但尽管如此 Unity 不支持动态关键字 这很奇怪 因为 NET 4 0它是 NET的一部分 除了在
  • Windows批量正则表达式搜索和替换

    我有一组这样的数据 7859 10000 00 7859 10000 00 xfer 1 要检查 1033 1035 32768 000 17 22174479 10000 00 xfer 2 待检查 1032 1035 它们从文件中读取并
  • 承诺不等待完成

    我今天看了很多例子 他们似乎建议以下代码应该在链中执行 let f gt return new Promise res rej gt console log entering function setTimeout gt console l
  • Oracle 如何处理 SQL 中的存储函数调用?

    伙计们 说吧 我有一个疑问 select t value my stored function t value from my table t where my stored function t value n Some Required
  • 更改上传的二进制文件字段的文件名

    我在用着Odoo8 我有一个问题我用过fields binary在 Odoo 中上传文件 但是当我尝试下载它时filename上传文件的内容是型号名称 是否可以更改filename文件的 其次 字段中的过滤器属性不起作用 我对这个问题的解决
  • 在并发环境中从地图中删除是否安全?在戈兰

    我是否需要在从地图上删除该项目之前先上锁 package main import errors sync time type A struct Error error func a A Job more job var l sync RWM