草庐IT

Goroutine-safe

全部标签

go - 从 goroutine 中的缓冲 channel 读取时的执行顺序

我在研究并发和缓冲channel时遇到了以下让我感到困惑的问题:https://play.golang.org/p/wir7wP2u-yf为什么函数echo中channel(大小为3)的“卸载”会发生在包含4的情况下?为什么5发送到channelc后,channel容量一直为0?为什么没有回显10?packagemainimport"fmt"funcecho(cchanint){fornum:=rangec{//fmt.Printf("lengthofchannelc:%v\n",len(c))fmt.Println(num)}fmt.Println("Doneiterating")}

go - 所有goroutine都处于 sleep 状态-死锁(无限循环+选择)

我有一个应用程序,每隔几秒钟就创建一个从api获取当前价格的例程。然后它将响应发送到监视例程以进行分析。如果监视器发现价格有明显变化,它会发送一个通知。如果每次执行程序之间的延迟较大,则可以正常工作。如果它很小,它不会:“致命错误:所有goroutine都处于休眠-死锁状态!”被触发,程序崩溃。我猜(?)死锁是由以下原因造成的:(1)监视器充斥着新的价格信息(并且未能及时分析这些信息);或(2)主功能被监视器的消息所淹没。在主函数将新价格附加到一个切片上的同时,监视器正在遍历它,这一事实可能也有一些缺点。如何解决这个问题?在阅读其他文章时,我认为“select”语句是一种神奇的治疗方法

go - 从另一个 goroutine 启动一个 goroutine 是什么意思?

来自thisfile,我不明白为什么函数startWorker会这样写:func(p*WorkerPool)dispatch(){fori:=0;ifuncstartWorker(taskChanchanfunc()){gofunc(){vartaskfunc()varokboolfor{task,ok=如果我是开发者,我会这样写这个函数:funcstartWorker(taskChanchanfunc()){vartaskfunc()varokboolfor{task,ok= 最佳答案 根据GoBestPracticesFranc

go - 避免在带有接口(interface)的范围内的 goroutine 中进行数据竞争

我有以下for...rangeblock,它使用goroutine调用url。funccallUrls(urls[]string,reqBodyinterface{})[]*Response{ch:=make(chan*Response,len(urls))for_,url:=rangeurls{somePostData:=reqBody//thisjustseemstocopyreference,notadeepcopygofunc(urlstring,somePostDatainterface{}){//serviceMutex.Lock()//deferserviceMutex.

go - 一个 goroutine 从结构中读取而另一个 goroutine 正在修改它是否安全?

更具体地说,在我的例子中,我有一个网络服务器和一个全局可访问的结构,网络服务器使用它来生成页面。我有另一个Goroutine,它总是定期用新值更新该结构。这会引起问题吗?我是否需要实现一种机制来确保它在更新时不被读取? 最佳答案 不,这正是不安全的定义,会被racedetector捕获如果你测试过它。您绝对需要同步访问,例如使用sync.Mutexorsync.RWMutex.如果始终拥有最新值并不重要,您还可以允许每个goroutine缓存结构的副本,然后每隔一段时间定期从“主”副本更新它们的副本经常。如果经常访问该结构,这有助于

go - panic : runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x8 pc=0x48be5c] goroutine 1 [running]:

我正在尝试使用链表实现多项式的加法。该程序成功地添加了幂0系数,但在第一次遍历后它出现了困惑。这是我到目前为止编写的代码。在初始化temp1!=nil之后,循环遍历else但当权力不同时不进入if循环并进入panic状态packagemainimport("fmt")typeNodestruct{coefficientintpowerintnext*Node}typeliststruct{head*Nodecountint}funcmain(){list1:=&list{}list1.addVariable(5,2)list1.addVariable(4,1)list1.addVari

go - 使用for循环遍历 channel 时出现Goroutine死锁

我正在尝试练习goroutine和channel,我在调用gorouting和传递channel时遇到问题。goroutine将数据推送到channel中,然后主线程将打印元素。我已经使用for循环来打印内容但是得到了。fatalerror:allgoroutinesareasleep-deadlock!21goroutine1[chanreceive]:main.main()packagemainimport"fmt"funcsmallThread(aint,cchanint){c编辑:使用WaitGroup:funcsmallThread(aint,cchanint,w*sync.

go - 使用goroutine插入 map 的问题

我是Golang的新手,正在学习使用goroutine。我正在尝试通过goroutines将许多字符串同时插入到map[int]string中packagemainimport("fmt""sync")funcinput(mmap[int]string,iint,wg*sync.WaitGroup){m[i]=fmt.Sprintf("line%d\n",i+1)fmt.Print(m[i])wg.Done()}funcGetMap(mmap[int]string,wg*sync.WaitGroup){wg.Add(5)fori:=0;i预期:第1行第2行第5行第3行第4行map[0:

go - sync.Once.Do 是否保证跨 goroutine 的可见性?

例子here暗示sync.Once.Do保证字符串vara跨goroutines的可见性。如果例如由sync.Once.Do调用的函数f()初始化结构实例的多个字段,是否也是如此?在没有任何额外同步的情况下,结构实例的所有字段是否对其他goroutine可见? 最佳答案 让我们分解一下example:变量a在函数setup()返回之前设置,因为在单个goroutine中的读取和写入必须表现得好像它们已执行按照程序指定的顺序[1].once.Do()对setup()的单次调用发生在once.Do()的任何调用之前返回[2].因此,a变

go - golang 的 GC 会释放仅由 goroutine 引用的对象的内存吗?

m:=map[string]*Object{"a":obj}gofunc(obj*Object){obj.Do()}(m["a"])delete(m,"a")当obj.Do()没有完成时,GC会释放obj的内存吗? 最佳答案 代码会求值m["a"]这会给出指针obj,然后obj会被放​​到goroutine的一个新栈上,然后goroutine会从那个栈开始,然后obj会从原来goroutine中的map中移除。那时新的goroutine堆栈将有一个指向obj的指针,因此在第二个goroutine完成执行之前,obj不会因为这个原因而