Monthly Read Posts in July 2019
Programming Languages
Go: Understand the Design of Sync.Pool
Insights:
package 的
init()
函数中注册 runtime GC 的回调,以清理池子中的数据会为每个 P 创建一个
pool
实例;每个实例包含 private 和 shared 两部分。其中 private 只能由 P 自己访问,因此无需考虑并发安全;shared 能被其他的 P 访问,需要考虑并发安全。
Get()
的操作顺序:private area -> shared area -> create via New()Put()
会尝试先把 item 放回 private area,如果 private 没有 item;否则就放到 shared area。
A pattern for overcoming non-determinism of Golang select statement
文章里说的 non-determinism 指的是在一个 select
statement 中监听多个 channel,channel的触发顺序是非确定性的。
这点应该算是一个 well-known background。
至于作者的做法,通过提供一个 interface ,把多个不同类型的 channel 给合并成了一个…
Algorithms
How to Generate a Sequence of Unique Random Integers
利用了 quadratic residues 的一个性质:
- x^2 mod p is unique as long 2x < p
- 在(1)基础上,p - x^2 mod p is unique, as long p mod 4 = 3
在此基础上设计一个 one-to-one 的排列函数 f;并且只要 f 的复合函数仍然满足 one-to-one,也仍然能够保持前面的 unique 性质。
BTW:说起来后面应该抽个时间补一下数学和算法了…
Concurrency
.NET 中 reader-writer lock 的一些内部实现。
.NET 的 rwlock 支持所谓的 upgrade/promotion,将一个 reader-lock 提升为 writer lock。
Misc
The Skills Poor Programmers Lack
- understand the working details
- anticipate problems
- learn to design and architect