简单说下问题:多个goroutine并发读写string,读取string(fmt.Println
和json.Marshal
)的goroutine会panic。根因是string是一个胖指针,除了pointer字段之外还有一个len字段的元数据。在给string变量赋值(拷贝)时,会逐个设置pointer和len字段,这个过程不是原子的。在有并发修改时,pointer和len就不一致了,这时就回发生问题:当len不为0,pointer为nil(0x0)时,就会panic: runtime error: invalid memory address or nil pointer dereference
。
本文首先探究下为什么golang string有这个问题,然后对比下java的string为什么没这个问题,最后介绍数据争用(data race)问题以及Golang和Rust如何避免该问题。
... ➦如何快速关闭WeGame和LOL客户端?恶心的wegame总是在关闭游戏的时候浪费我时间,所以写了一个批处理文件,一键关闭wegame和LOL客户端。
... ➦wsl 全称是 windows 的 linux 子系统,可以理解为在你的 windows 电脑上提供一个 linux 的工作环境。
windows 功能 | 作用 | 其他 |
---|---|---|
Hyper-V | 微软自己的虚拟化工具 | 包含了“管理工具”和“平台”,其中“平台”包含“服务”和“虚拟机监控程序” |
Windows Subsystem for Linux | WSL1,不是我们讨论的 WSL2 所需要的 | |
Virtual Machine Platform | 虚拟机平台(WSL2 的底层依赖) | 看到说 Hyper-V 也依赖这个,但启用 Hyper-V 并不需要启用虚拟机平台,因此我觉得 Hyper-V 依赖的是“Hyper-V 虚拟机监控程序”吧 |
Windows Sandbox | 一个隔离的桌面环境 | 我反正没用过,不了解 |
Windows 虚拟机监控程序平台 | 用于支持 vmware 等第三方虚拟机软件 |
- 虚拟机平台会一定程度上影响游戏性能,为了游戏性能,可以关闭虚拟机平台、Hyper-V。Windows 虚拟机监控程序平台、适用于 Linux 的 Windows 子系统我理解是不影响游戏性能的。参考用于在 Windows 11 中优化游戏性能的选项。
- Hyper-V 和 vmware 等软件是冲突的,详见虚拟化应用程序无法与 Hyper-V、Device Guard 和 Credential Guard 协同工作
关闭虚拟机平台和 Hyper-V 虚拟机监控程序:
... ➦