九维我操你爹
https://fixupx.com/i_make_hat/status/2019649852892934518
如果你拥抱日本人的规则,你就有遵守不完的规则
可能有点多余不过稍微中翻中一下:
咸鱼上你看到东西不错不讲价直接买了──被卖家打差评
咸鱼上下完单没和卖家打招呼──被打差评
下单一个多星期没看到发货问一下物流信息──被打差评
寄商品出去的时候没有在收件人名字后面加上“先生/女士”──被打差评
如果你拥抱日本人的规则,你就有遵守不完的规则
可能有点多余不过稍微中翻中一下:
咸鱼上你看到东西不错不讲价直接买了──被卖家打差评
咸鱼上下完单没和卖家打招呼──被打差评
下单一个多星期没看到发货问一下物流信息──被打差评
寄商品出去的时候没有在收件人名字后面加上“先生/女士”──被打差评
AI 已死,编程即将迎来人类时刻!
昨天 cursor 和 codex 多轮对话没解决的一个问题,本人出马 1 分钟就找到了根本原因,去给 AI 说了下完美解决。
现在人类发展太快了,再过五年会变成什么样子真的很难想象!
昨天 cursor 和 codex 多轮对话没解决的一个问题,本人出马 1 分钟就找到了根本原因,去给 AI 说了下完美解决。
现在人类发展太快了,再过五年会变成什么样子真的很难想象!
Paul E. McKenney 的 perfbook 实在太好看了,虽然我才肛开始读到第四章,但已经解决了好几个困扰我多年的技术问题了。
比如前两周我才和 codex 讨论了 go 里两个 goroutines 并发(并行)读写一个 u64 全局变量到底有什么危害,我之前以为最多就是并发写导致另一线程读到旧值,这种 bug 我是可以容忍的,于是省掉 atomic.Load 好了,毕竟原子操作性能也不好。
而书上 4.3.4.1 Shared-Variable Shenanigans 这一节列出来一大堆无保护并发读写共享变量的潜在危害,其中 Store tearing 引用的这个 2019 年很新(?)的内核讨论令我大吃一精: https://lore.kernel.org/lkml/20190821103200.kpufwtviqhpbuv2n@willie-the-truck/
上面的 bar 在某个历史版本 arm64 gcc -O2 编译出的结果是
而 arm64 在 v8.4a 之前 stp store pair 指令是非原子的,如果有无保护并发读,另一个线程可能会读到只修改了一半 32bits 的变量。
书上说这类问题用 volatile / WRITE_ONCE / READ_ONCE 就可以比较轻量级地解决,但 go 没有 volatile 只能用原子指令,令人忧愁。
比如前两周我才和 codex 讨论了 go 里两个 goroutines 并发(并行)读写一个 u64 全局变量到底有什么危害,我之前以为最多就是并发写导致另一线程读到旧值,这种 bug 我是可以容忍的,于是省掉 atomic.Load 好了,毕竟原子操作性能也不好。
而书上 4.3.4.1 Shared-Variable Shenanigans 这一节列出来一大堆无保护并发读写共享变量的潜在危害,其中 Store tearing 引用的这个 2019 年很新(?)的内核讨论令我大吃一精: https://lore.kernel.org/lkml/20190821103200.kpufwtviqhpbuv2n@willie-the-truck/
void bar(u64 *x)
{
*x = 0xabcdef10abcdef10;
}上面的 bar 在某个历史版本 arm64 gcc -O2 编译出的结果是
bar:
mov w1, 61200
movk w1, 0xabcd, lsl 16
stp w1, w1, [x0]
ret而 arm64 在 v8.4a 之前 stp store pair 指令是非原子的,如果有无保护并发读,另一个线程可能会读到只修改了一半 32bits 的变量。
书上说这类问题用 volatile / WRITE_ONCE / READ_ONCE 就可以比较轻量级地解决,但 go 没有 volatile 只能用原子指令,令人忧愁。
这个人用 AI 回我把我这篇感想的效果拉满了。。。
https://github.com/yihong0618/gitblog/issues/336#issuecomment-3850824162
https://github.com/yihong0618/gitblog/issues/336#issuecomment-3850824162