go sync.Mutex 源码阅读

Linux Kernel 提供 Semaphore/Mutex 来实现线程间的同步机制,可保证在同一个时间段 只有少量的线程可以访问同一块资源(也称为进入临界区域)。 线程之间要通过竞争来获得访问权限,一旦竞争失败,线程会进入到阻塞状态; 而阻塞的线程只能等待离开临界区域被内核唤醒。 go runtime 提供的 sync.Mutex 并不是采用内核级别的同步机制。 作为执行单元的线程一旦阻塞,意味该线程将不再受到 go runtime 控制, go runtime 需要创建新的线程来执行其他 runnable goroutine , 线程的数目会和竞争资源的请求成正比,容易造成资源浪费。 而 go 优势是 goroutine 轻量级调度,因此 sync.Mutex 选择在用户态来实现同步机制。 和线程阻塞类似,在无法进入临界区的情况下,goroutine 会主动释放当前的 执行单元 - 线程,进入到阻塞状态;在 sync.Mutex 持有者离开临界区之前, 阻塞状态的 goroutine 将不会出现在调度队列里。 这样被释放的线程会去执行其他 runnable goroutine,提升线程的利用率。 sync.Mutex 结构设计分析 Mutex 也被称之为锁。 // sync/mutex.go // A Mutex is a mutual exclusion lock. // The zero value for a Mutex is an unlocked mutex. // // A Mutex must not be copied after first use....

June 21, 2020

可以同时对一个 go string 进行读写操作吗?

写过 Go 代码的同学都知道,在程序内启动多个 goroutine 处理任务是很常见的事情, 启动一个 goroutine 要比启动一个线程简单的多。当多个 goroutine 同时处理同一份数据时, 我们应该在代码中加入同步机制,保证多个 goroutine 按照一定顺序来访问数据, 不然就会出现 data race。 最常见的例子如下,同时写操作 map 数据会导致程序 panic,即使操作的是不同 key: // example 1 package main func main() { for { c := make(chan bool) m := make(map[string]string) go func() { m["1"] = "a" // First conflicting access. c <- true }() m["2"] = "b" // Second conflicting access. <-c } } 那么下面的代码也会 panic 吗? // example 2 // 1 package main 2 3 import "sync" 4 5 func main() { 6 var wg sync....

May 30, 2020

在线看 O'Reilly 动物新书指南

想当初,为了看 Operating Systems: Three Easy Pieces 和 A Philosophy of Software Design 原版技术书,还特别麻烦了朋友从国外人肉带回来,成本极高。 但如果等国内出版社引进,就会出现时间跨度太大没法尝鲜;加上翻译水平参差不齐,等待中文版的路子基本上行不通。 为了解决这个尴尬问题,最近找到了一个比较实惠看国外原版书籍的方式:ACM Professional Membership。 ACM Professional Membership 会员权益 有很多,其中有一项是: Learning Center with resources for lifelong learning, including online courses targeted toward essential IT skills and popular certifications; online books & videos from Skillsoft®, online books from O’Reilly®, Morgan Kaufmann and Syngress; videos and webinars on hot topics, presented by today’s innovators 会员可以享受学习平台,其中包含了 O’Reilly online books。 平时在网上买技术书籍,基本上都能看到 O’Reilly 动物封面书籍,比如 Site Reliability Engineering。 这个出版社覆盖的书籍比较多,基本上能满足我大部分阅读需求。 本着怀疑的态度看这个权益,没想到尝试之后,真香。...

March 21, 2020

Hola Barcelona

前段时间因为 KubeCon 演讲去了趟西班牙-巴塞罗那,忙里偷闲,感受了下西方文化。 不再是「白本」 5.18 号从杭州出发,途径香港转机到巴塞罗那。飞机上的娱乐设施还算丰富,「海王」、「绿皮书」等新片都可以观看到。十几个小时的飞机总不能一直看电影,还得兼顾倒时差的任务。 之前没有调整时差的经验,加上平时作息比较规律,十三个小时的飞行过程里相对属于清醒状态。网络要收费,印象中比较贵,基本上干不了别的事情,除了看电影就是睡觉。如果经济允许,可以考虑升舱,坐经济舱飞十几小时简直了。到达 巴塞罗那 是当地时间早上8点,天气还算不错,就是有点过于「凉快」,完全没有夏天的感觉。上了摆渡车,直奔海关。 当地的海关工作人员整体都不严肃,有些还带着耳机工作,有点不可思议。轮到我的时候,那位海关小哥看了我半天,感觉不像,盖章的时候特别犹豫,而且盖完章之后他应该是后悔了,还用类似验钞机的东西反复扫描我的签注,最后才说「Wei Fu, Welcome」。 说句实在话,我当时的反应是这签证不会特么是假的吧,因为从广州签证处提交申请到拿到签证只花了「三天」,申请港澳通行证都没有那么快。还好,有惊无险。 骑行友好的街道 虽然没有游玩整个 巴塞罗那 ,但是可以感觉到城市的大部分街道都是单行道。我在早高峰的时候打过车,车多但不算堵。 说到打车,这里的打车算是一件高消费的服务了。我没有用 Uber/MyTaxi 软件打车,大部分都是通过酒店来约车,而这种约车是需要收调度费,大概2-3 欧左右吧。接近4公里左右的路程要 15 欧,贵! 可能是养一辆车的费用比较高吧,这座城市的摩托车特别多,几乎随处可见。比较有意思的是摩托车车锁,他们的车锁是锁车把和车身,基本上不需要下蹲去锁车。 虽然北京也有自行车道,但是大部分都被私家车占用了,对骑行的人来说极度不友好。这边的街道基本是两车道配一个自行车道,而汽车道和自行车道基本上严格分开,有些地方还有隔离带,对爱骑车的人来说真是太幸福了。 如果你打开 Mobike,估计还会有惊喜哦。 地铁,还不算太破 我住的酒店离地铁站不远,走几个街头就可以到达地铁站。在长达 15 个小时日照时间里,在拓展区里步行还算安全,也比较舒服。 随处可见的遛狗人士,转角处的饮酒闲谈,还有无法欣赏的涂鸦。建筑都相对破旧,估计这十几年的变化也就是街上跑的私家车了。 不管是去日本,还是来到 巴塞罗那,这边的地铁和火车一样,发车和到达时间点都是严格规定好的。这有个好处就是,每天都可以踩点出发。 整个城市的地铁覆盖范围还是比较大,就是不同的区域由不同的公司运营,换乘基本上要出站重新购票了。如果不买套票,单程票就要 2.2 欧,贵的一匹。刷票进站后,给人感觉就是简陋,但不算太破。 语言?No English 巴塞罗那 选择的时区和德国好像是一样的,都是东一区。在夏天,他们日照时间有 15 小时,到晚上 9 点天还是亮的。 因为长时间日照的原因,他们物产是比较丰富的。但是想不明白的是,他们这边的特产是「西班牙火腿」。这火腿是腌制好几年而成,吃的时候切的越薄口感越好。主要这是生肉。。。 和当地的「潮州佬」店主聊,他们当地喜欢吃「生」,日料店相对中餐而言要受欢迎些,估计是好吃「生」的食材吧。尝过 Tapa,也看过所谓的海鲜饭,还是觉得国内的菜还吃。 出去吃饭更要命的是,点菜的时候没有图片,加上有些还没有英文注释,基本就瞎了。看不懂可以问吧,但是这边的人不太会说英语,也不愿意说。你可以想象下,机场里的工作人员会直接对你「No English」。这体验真的比去日本还糟糕。 一直在「修」 城市比较小,到达的第一天就小转了一圈。 因为加泰罗尼亚要闹独立,涂鸦就是这边的独特的风景线。从酒店走到港口,街道上的店铺都没开门。问了下当地国人,说这边的人比较懒,周末基本都享受去了,开便利店的基本都是非本地人。 一路上都有海鸥到处飞,海鸥也不怕人,基本给啥吃啥,爆米花都吃! 在港口溜达一会,就去看世界上最著名的「烂尾楼」 - 「圣家族大教堂」。这座大教堂修了 100 年,因为修的时间是在太长了,不知道是不是中间换了几个设计师,教堂每个角度的风格都不太一样。不过这也算是巴塞罗那著名景点了,只可惜当天去的时候没有门票了,没能进去。 最后 这次出国没准备攻略,基本上是很佛系地逛了下,剩下大部分时间都在准备演讲内容。不过怎样,出远门才觉得国内是真TM方便。

June 2, 2019

工作三年

不知不觉就过了三年,但是我还能很清楚地记得当时签卖身契的场景,只能说毕业之后时间过的飞起。这三年没写过什么年度总结,今天打算矫情一把,记下流水账。 Vimer 有一次参加罗老师开发环境的分享会后,我就开始迷上 vim,并结束了 IDE/Sublime 之间的摇摆。从实用角度看,IDE 有着开箱即用的特点,这的确让人无法抗拒。但在平时的工作里,不同语言之间切换是常有的事,而且经常远程调试、常年沉浸在 Terminal 的我,vim 作为编辑器是一个不错的选择。加上韩国小哥 junegunn 开源神器 fzf ,解决了 vim 全文检索巨卡的痛点,这让我毫不犹豫地坚持使用 vim。没试过 fzf 的朋友不妨试试! 我在习惯 HJKL 的同时,也在尝试回馈社区。还记得刚用 fzf.vim 的时候,当时的全文检索没有预览功能,相比于 Sublime,几乎没法用。所以在参加完公司第二个 Hackathon 之后的那个周末提了人生的第一个 PR。在这期间和韩国小哥 junegunn 来来回回讨论了快一个月,虽然最后失败了,但是我很享受这期间的沟通过程,毕竟能把自己的想法表达清楚是一件难得的事,因为非实时的沟通一旦出现理解偏差,时间成本将会急速上升。 在后来使用了 vim-delve 插件,并帮助作者修复了几个 bug,也算是回馈社区了~ MIT 6.828 在 16 年年初,非计算机专业的我选择了恶补操作系统:MIT 6.828。 前前后后花了三个周末完成所有基本要求。课程设计者虽然尽可能地避免了琐碎的硬件操作,但是这三个周末还是非常的虐,毕竟 x86 架构有很多历史包袱,需要阅读 Intel x86 的开发文档。。。这三个周末完成的玩具内核让我重新认识了操作系统, 对我后续的工作帮助极大。 不过你们会相信恶补的原因只是想知道 fork 怎么做到两个返回值 吗? Gopher 语言切换算是这三年里最大的变化吧。为了看 Docker 的代码而接触 Golang,但是在16年年底的时候公司并没有项目让我去实践,当时的我只能自己啃代码,等到真正实践的时候也差不多到17年年中了。 去年七八月我偶然发现 PingCAP 有赠马克杯的 TiDB 重构活动,很幸运的是提的三个 PR 都被接受了,这也是我第一次在 Github 上贡献代码。再后来就是 Pouch,因为对容器的喜爱吧,几乎大部分的空闲时间都参与到 Pouch 上来了。 除了代码以外,还因为 Golang 开源项目结识了一些朋友,不得不说真是名副其实的 G**hub。...

April 13, 2018