首页 > 文章列表 > 如何从并发映射写入中恢复?

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

golang
218 2023-03-08

问题内容

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

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

例子:

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 正在写入 map,则其他 goroutine 不应该同时读取或写入 map。 如果运行时检测到这种情况,它会打印诊断信息并使程序崩溃。 了解更多问题的最佳方法是在[比赛检测器](https://blog.golang.org/race- detector)下运行程序,这将更可靠地识别比赛并提供更多细节。

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

除了防止同时滥用地图之外,您无能为力。如果您让您的应用程序保持这样并且它不会崩溃,那么您可能会在运行时遇到神秘的、未定义的行为。