- 2024-08-25golang mutex原理
最近面试遇到问锁的问题,答得不是很好,重新做一下总结梳理 go中的sync包提供了两种锁的类型,分别是互斥锁sync.Mutex和读写锁sync.RWMutex,这两种锁都属于悲观锁饥饿模式与正常模式在下面的内容会经常涉及到一个概念,饥饿模式,这里先简单说一下1.正常模式(非公平锁)正常模式下,所
- 2024-08-23Go如何获取goroutineId
runtime包packagemainimport("bytes""log""os""runtime""strconv""time")funcgetGoroutineID()uint64{b:=make([]byte,64)b=b[:runtime.Stack(b,false
- 2024-08-19深入理解 Go 语言原子内存操作
原子内存操作提供了实现其他同步原语所需的低级基础。一般来说,你可以用互斥体和通道替换并发算法的所有原子操作。然而,它们是有趣且有时令人困惑的结构,应该深入了解它们是如何工作的。如果你能够谨慎地使用它们,那么它们完全可以成为代码优化的好工具,而不会增加
- 2024-07-30深入解析 Go 语言 GMP 模型:并发编程的核心机制
前言本章是Go并发编程的起始篇章,在未来几篇文章中我们会围绕Go并发编程进行理论和实战的学习,欢迎关注我哦!本章主要以介绍GMP模型为主,偏向于面试和八股,目的是让小伙伴们注重于知识本身,面向面试,面向八股,面向加薪。Go语言自诞生以来,就以其简洁、高效的并发模型著称。而这其中的核
- 2024-07-29【Golang 面试 - 进阶题】每日 3 题(三)
✍个人博客:Pandaconda-CSDN博客
- 2024-07-28【Golang 面试 - 进阶题】每日 3 题(三)
✍个人博客:Pandaconda-CSDN博客
- 2024-07-23交替打印数字和字母
/*问题描述使用两个goroutine交替打印序列,一个goroutine打印数字,另外一个goroutine打印字母,最终效果如下:12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728*/funcQuestionOne(){ numChan,letterChan:=make(chanstruct{}),make(ch
- 2024-07-19Go Context的使用详解
GoContext的使用在Gohttp包的Server中,每一个请求在都有一个对应的goroutine去处理。请求处理函数通常会启动额外的goroutine用来访问后端服务,比如数据库和RPC服务。用来处理一个请求的goroutine通常需要访问一些与请求特定的数据,比如终端用户的身份认证信息、验证
- 2024-07-13计算一组整数的平方,并打印出来
packagemainimport("fmt""sync")funcsquare(test*sync.WaitGroup,nint){//使用sync.WaitGroup来等待所有goroutine完成defertest.Done()//确保在square函数结束时减少WaitGroup的计数器值fmt.Printf("平方数:%d\n",n
- 2024-07-02day13 Goroutine 协程
了解计算机原理进程:计算机资源分配单位线程:cpu处理单位协程:以特殊机制或者函数实现高并发,又称轻量级线程了解GoroutineGoGoroutine,go语言中的协程,实现并发。关键字go初始大小4k,随着程序执行自动增长和删除实现多线程并发执行packagemainimport"fmt"fu
- 2024-06-23[Golang基础]Goroutine
协程(CoRoutine)是一种轻量级的用户态线程。简单来说,线程(thread)的调度是由操作系统负责,线程的睡眠、等待、唤醒的时机是由操作系统控制,开发者无法决定。使用协程,开发者可以自行控制程序切换的时机,可以在一个函数执行到一半的时候中断执行,让出CPU,在需要的时候再回到中断点继续执行。
- 2024-06-23[Golang并发]Sync.Mutex
源码//Copyright2009TheGoAuthors.Allrightsreserved.//UseofthissourcecodeisgovernedbyaBSD-style//licensethatcanbefoundintheLICENSEfile.//Packagesyncprovidesbasicsynchronizationprimitivessuchasmutual//exclusionlocks.
- 2024-06-21Golang并发
Sync.MutexMutex结构typeMutexstruct{ stateint32 semauint32}Sync.Mutex由两个字段构成,state用来表示当前互斥锁处于的状态,sema用于控制锁状态的信号量互斥锁state(32bit)主要记录了如下四种状态:waiter_num(29bit):记录了当前等待这个锁的goroutine数量starving(
- 2024-06-18Go并发相关
map是并发安全的吗?首先我们写一段程序验证一下,创建两个goroutine,同时对一个map进行写操作,看看会发生什么吧!funcmain(){m:=make(map[string]int)m["foo"]=1varwgsync.WaitGroupwg.Add(2)gofunc(){fori:=0;i<1000;i++{
- 2024-06-16Go Goroutine 究竟可以开多少?(详细介绍)
GoGoroutine究竟可以开多少?Go语言因其高效的并发处理能力而备受欢迎,而Goroutine则是Go语言实现并发编程的核心。Goroutine比传统的线程更加轻量,允许开发者轻松地处理大量并发任务。那么,Go语言中的Goroutine究竟可以开多少呢?在回答这个问题之前,我们需要先了解两个关键问题
- 2024-06-12golang sync.Map 与使用普通的 map 的区别
使用sync.Map与普通的Gomap主要有以下几点区别:1.并发安全性普通map:在没有外部同步的情况下,不是并发安全的。在多goroutine访问时,如果没有适当的锁或其他同步机制保护,可能会导致数据竞争和未定义行为。sync.Map:是并发安全的。它内部实现了必要的同步机制,允许多
- 2024-06-11Go语言goroutine调度器初始化
1、调度器初始化调用点:src/runtime/asm_amd64.s:349 -> CALLruntime·schedinit(SB)runtime/proc.go:526funcschedinit(){//raceinitmustbethefirstcalltoracedetector.//Inparticular,itmustbedonebeforemallocinitbelowcallsracemapshadow.
- 2024-06-02Go语言之goroutine + channel 计算素数
计算素数通道协程之间的关系并发的俩种思想:第一个通过共享内存,需要锁来保证并发安全。第二个通过通信来。go语言通过channel.channel是协程安全的。通道intchan来传递要计算的数通道primechan来传递结果是素数通道exitchan来保证计算的协程都完毕协程inttocha
- 2024-05-29golang errgroup 的作用
errgroup是Go中用于并发控制和错误处理的一个工具,提供了一种方便的方式来协调多个goroutine。它允许你在一个组中运行多个goroutine,并等待它们全部完成,同时收集和返回第一个发生的错误。它的主要作用包括:同步:errgroup.Group提供了一个Wait方法,这个方法会阻塞调
- 2024-05-28两个 goroutine 交替打印 1-100
两个goroutine交替打印1-100channel操作//两个Goroutine交替打印1到100funcmain(){ ch1,ch2:=make(chanint),make(chanint) done:=make(chanint) gofunc(){ forx:=rangech1{ println("ch1:",x) ch2<-x+1 } }() gofunc(
- 2024-05-28【go从入门到精通】精通并发编程-使用atomic管理状态和同步的无锁技术
了解原子计数器 在Go中,原子计数器是多个goroutine可以同时访问的共享变量。术语“原子”是指在计数器上执行的操作的不可分割的性质。在Go中,原子计数器允许多个goroutine安全地更改共享变量,而无需使用锁或任何其他显式同步,这可确保数据完整性并避免竞
- 2024-05-21golang select 和外层的 for 搭配
select语句通常与for循环搭配使用,但并不是必须的。在某些情况下,select可能会直接放在一个独立的goroutine中,没有外层的for循环。这通常发生在你知道只会有一次或有限次操作的情况下。例如,你可能有一个简单的goroutine,它等待一个特定的channel信号,然后执行一次操作:package
- 2024-04-26sync.WaitGroup
sync.WaitGroup是Go语言标准库中提供的一个同步原语,用于在并发环境中协调多个Goroutine的执行顺序,确保所有并发任务完成后再继续执行后续逻辑。以下是sync.WaitGroup的使用方法:创建WaitGroup:使用sync.WaitGroup类型的零值创建一个实例,无需调用任何构造函数:varw
- 2024-04-23GO中的sync.Cond
条件变量是基于互斥锁的,它必须基于互斥锁才能发挥作用,条件变量的初始化离不开互斥锁,并且它的方法有点也是基于互斥锁的//使当前goroutine进入阻塞状态,等待其他goroutine唤醒func(c*Cond)Wait(){}//唤醒一个等待该条件变量的goroutine,如果没有goroutine在等待,则该方法会立
- 2024-04-19一次 kafka 消费者的性能调优过程
背景最近上线了一个kafka的消费者,数据规模大概是低峰期单机每分钟消费88W条,QPS14666。上线后看了下数据,进程CPU到了132%。 8核的机器,单进程CPU132倒也还好,但还是想看看,到底是咋回事。过程第一次排查&优化(协程池化->约为0优化)于是就开始采集pprof的数据。golangpprof的采