关于async和await的探讨缘起最近在看《深入解析C#(第4版)》这本书,看到了第五章,这一章节是关于异步。之前对异步这个概念只能算是一知半解,了解了它的概念和用法,但是对它的实际场景和为了解决什么问题而诞生的是不太清楚的。于是乎,就和小伙伴之间有了一场讨论。 2021-12-03 笔记 #C# #随笔
Go语言核心36讲-并发安全字典sync.Map (上)今天再来讲一个并发安全的高级数据结构:sync.Map。众所周知,Go 语言自带的字典类型map并不是并发安全的。 2021-11-30 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-context.Context类型使用WaitGroup值的时候,我们最好用“先统一Add,再并发Done,最后Wait”的标准模式来构建协作流程。 如果在调用该值的Wait方法的同时,为了增大其计数器的值,而并发地调用该值的Add方法,那么就很可能会引发 panic。 这就带来了一个问题,如果我们不能在一开始就确定执行子任务的 goroutine 的数量,那么使用WaitGroup值来协调它们和分发子任务的 goroutine, 2021-11-29 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-临时对象池sync.Poolsync.Pool类型可以被称为临时对象池,它的值可以被用来存储临时的对象。与 Go 语言的很多同步工具一样,sync.Pool类型也属于结构体类型,它的值在被真正使用之后,就不应该再被复制了。 这里的“临时对象”的意思是:不需要持久使用的某一类值。这类值对于程序来说可有可无,但如果有的话会明显更好。它们的创建和销毁可以在任何时候发生,并且完全不会影响到程序的功能。 同时,它们也应该是无需被区分的 2021-11-29 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-sync.WaitGroup和sync.Once之前在一些场合下里,我们使用通道的方式看起来都似乎有些蹩脚。 比如:声明一个通道,使它的容量与我们手动启用的 goroutine 的数量相同,之后再利用这个通道,让主 goroutine 等待其他 goroutine 的运行结束。 这一步更具体地说就是:让其他的 goroutine 在运行结束之前,都向这个通道发送一个元素值,并且,让主 goroutine 在最后从这个通道中接收元素值,接收的次数 2021-11-26 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-panic函数、recover函数以及defer语句(上)Go 语言的另外一种错误处理方式,不过,严格来说,它处理的不是错误,而是一场,并且时一种在我们意料之外的程序异常。 2021-11-25 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-错误处理(上)error类型其实是一个接口类型,也是一个 Go 语言的内建类型。在这个接口类型的声明中只包含了一个方法Error。Error方法不接受任何参数,但是会返回一个string类型的结果。它的作用是返回错误信息的字符串表示形式。 2021-11-25 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-原子操作(上)互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的 goroutine 只有一个。读写锁对共享资源的写操作和读操作则区别看待,并消除了读操作之间的互斥。 条件变量主要是用于协调想要访问共享资源的那些线程。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程,它既可以基于互斥锁,也可以基于读写锁。当然了,读写锁也是一种互斥锁,前者是对后者的扩展。 通过对互斥锁的合理使用,我们可以 2021-11-24 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-原子操作(下)今天的问题是:sync/atomic包中提供了几种原子操作?可操作的数据类型又有哪些?问题解析__第三个衍生问题__: 比较并交换操作与交换操作相比有什么不同?优势在哪里? 回答是:比较并交换操作即 CAS 操作,是有条件的交换操作,只有在条件满足的情况下才会进行值的交换。 2021-11-24 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-条件变量sync.Cond(上)前导知识:条件变量与互斥锁我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。 条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程。 2021-11-24 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-条件变量sync.Cond(下)知识扩展问题 1:条件变量的Wait方法做了什么?在了解了条件变量的使用方式之后,你可能会有这么几个疑问。 为什么先要锁定条件变量基于的互斥锁,才能调用它的Wait方法? 为什么要用for语句来包裹调用其Wait方法的表达式,用if语句不行吗? 2021-11-24 笔记 #笔记 #go #Go语言核心36讲
Go语言核心36讲-sync.Mutex与sync.RWMutex从本篇文章开始,我们将一起探讨 Go 语言自带标准库中一些比较核心的代码包。这会涉及这些代码包的标准用法、使用禁忌、背后原理以及周边的知识。 2021-11-23 笔记 #笔记 #go #Go语言核心36讲