为了账号安全,请及时绑定邮箱和手机立即绑定

使用golang的goroutine时如何实现计数器?

使用golang的goroutine时如何实现计数器?

Go
慕莱坞森 2021-05-14 15:15:45
我正在尝试制作具有推入和弹出功能的队列结构。我需要使用10个线程推入和另外10个线程弹出数据,就像我在下面的代码中所做的那样。问题:我需要打印出我已推送/弹出的数量,但是我不知道该怎么做。反正有加速我的代码吗?代码对我来说太慢了。package mainimport (    "runtime"    "time")const (    DATA_SIZE_PER_THREAD = 10000000)type Queue struct {    records string}func (self Queue) push(record chan interface{}) {    // need push counter    record <- time.Now()}func (self Queue) pop(record chan interface{}) {    // need pop counter    <- record}func main() {    runtime.GOMAXPROCS(runtime.NumCPU())    //record chan    record := make(chan interface{},1000000)    //finish flag chan    finish := make(chan bool)    queue := new(Queue)    for i:=0; i<10; i++ {        go func() {            for j:=0; j<DATA_SIZE_PER_THREAD; j++ {                queue.push(record)            }            finish<-true        }()    }    for i:=0; i<10; i++ {        go func() {            for j:=0; j<DATA_SIZE_PER_THREAD; j++ {                queue.pop(record)            }            finish<-true        }()    }    for i:=0; i<20; i++ {        <-finish    }}
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

对问题1的回答:正如jimt建议的那样,sync / atomic具有自动更新计数器的功能,这可能对您有用。

问题2的答案:减小DATA_SIZE_PER_THREAD的值,或者更好的方法是使用该程序

package main
func main() {}

它以更有效的方式产生与您的程序相同的输出。

认真地说,我了解您已经编写了一个小程序来探索一些概念。您的程序中包含许多问题。现在不是担心速度的时间,而是学习一些基本概念的时间。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 290 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信