处理并发地图修改:恢复与运行时崩溃的困境
在处理并发地图访问时,可能会遇到一种特殊的情况:从“并发映射读取和映射写入”恐慌中恢复似乎是徒劳的。这是因为运行时在这种情况下的行为不是恐慌,而是故意崩溃。
在 Go 1.6 中,运行时引入了并发滥用映射的检测机制。如果多个 goroutine 尝试同时修改映射,则运行时会触发崩溃,并打印诊断消息。这种行为源于当同时访问映射进行写入操作时潜在的未定义行为的固有危险。
不幸的是,使用 defer 和恢复来处理恐慌的典型方法在这种情况下是无效的。恢复函数无法拦截运行时发起的崩溃。推荐的解决方案是完全防止并发滥用映射。
在提供的示例中:
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) }
对映射“m”的并发写入将触发运行时崩溃。为了防止这种情况,需要采用同步机制,例如使用互斥体或通道,以确保在写入操作期间对映射的独占访问。
以上是为什么 Go 中 `recover` 无法处理并发地图修改崩溃?的详细内容。更多信息请关注PHP中文网其他相关文章!