当前位置: 首页 > 面试题库 >

如何从并发映射写入中恢复?

施弘壮
2023-03-14
问题内容

如何从“并发映射读取和映射写入”的运行时恐慌中恢复?通常,恢复时的延迟似乎不起作用。这是为什么?

我知道您不应该在并发上下文中使用地图,但是仍然:如何在此处恢复?

例:

package main

import "time"

var m = make(map[string]string)

func main() {
    go func() {
        for {
            m["x"] = "foo"
        }
    }()
    go func() {
        for {
            m["x"] = "foo"
        }
    }()

    time.Sleep(1 * time.Second)
}

请添加恢复代码。:)


问题答案:

恢复在这里不起作用,因为您遇到的不是紧急状态。

Go
1.6向
运行时添加了轻量级的并发滥用地图检测功能:

运行时增加了轻巧,尽力而为的检测并发滥用地图的功能。与往常一样,如果一个goroutine正在写入地图,则其他goroutine不应同时读取或写入地图。
如果运行时检测到这种情况,它将打印诊断并使程序崩溃。 找出更多有关该问题的最佳方法是在“
种族检测器”下运行该程序,这将更可靠地识别种族并提供更多详细信息。

您遇到的是运行时 故意崩溃 ,这不是panic()调用的结果导致recover()延迟函数中的调用可能停止。

除了阻止并发滥用地图外,您无能为力。如果您以这种方式离开应用程序并且不会崩溃,那么您可能会在运行时遇到神秘的,未定义的行为。



 类似资料:
  • 问题内容: 我有一个数据结构,我希望能够在关闭程序之前写入文件,然后在下次应用程序启动时从文件中读取数据以重新填充该结构。 我的结构是。对象很简单;对于成员变量,它具有一个String和两个布尔类型的小型本机数组。这是一个真正简单的应用程序,我希望一次不会超过10-15 对。 我一直在尝试(不成功)对象输入/输出流。我需要使对象类可序列化吗? 您能给我一些最好的建议吗?我只需要向正确的方向推进即可

  • 问题内容: 在具有并发访问的程序中使用映射时,是否需要在函数中使用互斥体来 读取 值? 问题答案: 读者众多,没有作家可以: https://groups.google.com/d/msg/golang- nuts/HpLWnGTp-n8/hyUYmnWJqiQJ 一个作家,没有读者是可以的。(否则,地图不会太好。) 否则,如果至少有一个作家,而作家或读者至少还有一个,那么 所有 读者 和 作家都

  • 根据Go博客, 地图对于并发使用是不安全的:它没有定义当您同时读写地图时会发生什么。如果需要从并发执行的goroutines读取映射和向映射写入映射,则访问必须通过某种同步机制进行调解。(来源:https://blog.golang.org/go-maps-in-action) 有人能详细说明一下吗?跨例程的并发读取操作似乎是允许的,但是如果尝试读取和写入同一个键,并发读取/写入操作可能会生成竞争

  • 编者按:此代码示例来自Rust 1.0之前的版本,它使用的代码在Rust 1.0中不存在。更新了一些答案,以回答更新版本的Rust的核心问题。 我正在尝试使用创建内存映射文件。目前的做法如下: 这个程序失败了 调用或对数据执行任何其他操作时。 我无法从

  • 如何编写java。util。映射到avro?在GenericData中,我看到了记录等的条目,但没有看到映射的条目。同样的问题也存在http://apache-avro.679487.n3.nabble.com/How-to-write-an-AVRO-map-Something-like-GenericData-Map-td3407527.html,但我不知道到底是怎么做到的。