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

我正在尝试制作具有推入和弹出功能的队列结构。


我需要使用10个线程推入和另外10个线程弹出数据,就像我在下面的代码中所做的那样。


问题:


我需要打印出我已推送/弹出的数量,但是我不知道该怎么做。

反正有加速我的代码吗?代码对我来说太慢了。

package main


import (

    "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

    }

}


慕莱坞森
浏览 291回答 2
2回答

Cats萌萌

对问题1的回答:正如jimt建议的那样,sync / atomic具有自动更新计数器的功能,这可能对您有用。问题2的答案:减小DATA_SIZE_PER_THREAD的值,或者更好的方法是使用该程序package&nbsp;main func&nbsp;main()&nbsp;{}它以更有效的方式产生与您的程序相同的输出。认真地说,我了解您已经编写了一个小程序来探索一些概念。您的程序中包含许多问题。现在不是担心速度的时间,而是学习一些基本概念的时间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go