! https://zhuanlan.zhihu.com/p/145642516

学习网络上某一专栏的记录。非入门教材,不会事无巨细的写,所以阅读前最好有一定Linux编程基础和了解。

总结四种线程同步技术。

自旋锁: 当线程请求锁失败后,不会被挂起,反而不断地询问请求。优点是不用进内核,避免上下文切换,缺点是太浪费CPU。

Mutex: 这个和 Semaphore 一起说。Mutex有点像上厕所,你上了锁了门,别人就不能上了。Semaphore有点像停车场,车停满了你就不能进(临界区),同时停车场可以有大的小的,数量可调。

Mutex底层是阻塞线程被挂起,然后把锁交给内核(这个时候不可避免要发生上下文切换和拷贝复制)。内核看着这个锁,等状态变化了,就唤醒进程,并把锁传过去(又有拷贝),进程进入锁。

条件变量: 可以理解为一种锁,这种锁具有消息订阅和发送功能。所以如果你new 一个Sync.Cond,当它发布消息的时候,所有订阅(Wait)的线程都会收到。这个有点像内核唤醒线程,但是注意,这个发布和订阅机制应该是完全运行在用户态,所以效率应该是比较高的。

读写锁: 好像大佬们都不是很看好读写锁,比如【如何理解互斥锁、条件锁、读写锁以及自旋锁? - 邱昊宇的回答 - 知乎 https://www.zhihu.com/question/66733477/answer/246535792】,具体原因是至少需要一把锁来维护当前读者数(这里没明白)。