私は、プッシュおよびポップ機能を持つキュー構造体を作成しようとしています。golangのゴルーチンを使用するときにカウンタを実装する方法は?
私は以下のコードのように、10スレッドのプッシュと10スレッドのポップスのデータを使用する必要があります。
質問: 1.私はプッシュ/ポップした量を印刷する必要がありますが、その方法はわかりません。 2.コードを高速化するにはどうすればよいですか?コードは私にとっては遅すぎます。
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
}
}
ありがとう@jimt、しかし、あなたが意味することを**私はかなり理解していない**キュータイプは、ポインタ受信機を持っている必要があります**、あなたは私にゴランのドキュメントのリンクを与えることができますか?私は何も見つけることができません、再びありがとう。 – MrROY
@MroY:Effective Goのこのセクションでは、その違いについて説明します:http://golang.org/doc/effective_go.html#pointers_vs_values本質的には、レシーバが(T)の場合、メソッドは呼び出されたオブジェクトの*コピー*を取得するため、変更できません。受信機が(* T)の場合は、それを指すポインタを取得します。 –
ゴルーチンの数がコンパイル時に厳密に知られていない場合、作成されたそれぞれのゴルーチンで 'wg.Add(1)' 'defer.wg.Done()を呼び出さない理由がありますか? – matthias