Ryo's blog

标签 · GoSourceCode

首页

关于

归档

GolangGoSourceCode

Go源码——Sync.Mutex

一、背景sync.Mutex是我们常用到的一把锁。网上讲这个锁的文章也比较多,这里面主要是为了简单做个自我总结。 Sync.Mutex 慢路径底层依赖的是runtime_SemacquireMutex和runtime_Semrelease,对这个不了解可以先去看下 runtime.semaphore 。 二、Sync.Mutex 源码2.1 发展历史sync.Mutex第一版 代码 是2008年的时候 @rsc 提交的。最早的实现比较简单,是通过简单的CAS加信号量的方式来实现的。信号量具体可以参考 runtime-sema 这篇文章。 @dvyukov 2011年的时候,提交了第一次优化了 sync: improve Mutex to allow successive acquisitions,这一版中加..

更多
GolangGoSourceCode

Go源码——runtime.semaphore

一、背景sync.Mutex里面用了runtime_SemacquireMutex和runtime_Semrelease,所以看下这个runtime的信号量是如何实现的。 二、基础知识2.1 信号量信号量(英语:semaphore)又称为信号标,是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态。 信号量的概念是由荷兰计算机科学家艾兹赫..

更多
GolangGoSourceCode

Go源码——runtime.mutex

一、背景在Go的runtime包中封装了一个 mutux ,这个mutex被runtime包中大量组件使用,比如 channel、netpoll、检查活跃的定时器 等等。 sync.Mutex和runtime.mutext区别:简单说就是sync.Mutex是用户层的锁,Lock抢锁失败会造成goroutine阻塞(会调用gopark)。runtime.mutex 是给 runtime使用的锁,Lock抢锁失败,会造成m阻塞(线程阻塞,底层调用的futex)。 二、基础知识2.1 MutexMutex 全称是Mutual Exclusion ,俗称互斥体或者互斥锁。是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。 2.2 mmap 函数mmap它的主要功能是将一个虚拟内..

更多
GolangGoSourceCode

Go源码——Sync.Map的前生今世

一、背景前段时间有个朋友来问我Go的Sync.Map性能怎么样,一般什么场景推荐使用。一句话介绍的话,就是Sync.Map底层有两个map,一个是read,一个是dirty,读写read中数据不需要加锁,读写dirty不用需要加锁,适用于读多写少的场景。 碎碎念其实2020年的时候Go源码里面一些比较常用的包都大致看了一遍,当时跟槊槊、大飞哥、周老板空闲时间天天讨论各种技术细节,包括但不仅限于操作系统、MySQL、Redis、分布式、Go、项目架构方法论等。很多时候观点不合还会争的面红耳赤,最后还会上升到人生攻击,你不服我,我也不服你(实际上互有对错,我也被打过几次脸)。因为有的东西,网上有很多错误的资料,导致我养成了一个习惯,找资料的时候我一般都是去看一些权威的技术书或者直接去看开源组件源码,能用代码说的..

更多