简单说下问题:多个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客户端。
... ➦最近在自己的rust_http_proxy中实现了简单的反向代理,第一版用的是手搓的无连接池版本,大致流程如下:
TcpStream::connect
建立连接conn::http1::Builder
拿到 sender
sender.send_request(new_req)
工作的很正常,但是没有连接池。想到 hyper
官方提供的 reqwest
是有内置连接池的,于是研究了下做了改造,记录下过程中读到的代码。
下载MSIAfterburner.cfg到 %programfiles(x86)%\MSI Afterburner\Profiles
。当前版本是4.6.6(beta3),下载地址:msi官方或guru3d下载。核心效果是展示各个cpu核心的使用率,如下:
下图是展示aida64提供的电压的配置:
... ➦