大家好。任务是开发一个在竞争环境中工作的计数器结构。我不确定我是否正确理解了“结构计数器”一词。也许有人知道计数器结构是什么意思?我是这么理解的
package main
import (
"sync"
"github.com/udonetsm/help/helper"
)
type Counter struct {
num int
sync.RWMutex
}
func (c *Counter) Count(wg *sync.WaitGroup, finish, start int) int {
defer helper.PanicCapture("Count")
wg.Add(finish - start)
for c.num < finish {
go func() {
c.Lock()
c.num += 1
c.Unlock()
wg.Done()
}()
}
return c.num
}
func New(start int) *Counter {
defer helper.PanicCapture("INIT")
return &Counter{
num: start,
}
}
func Counting(start, finish int) {
defer helper.PanicCapture("Counting")
c := New(start)
wg := sync.WaitGroup{}
c.Count(&wg, finish, start)
wg.Wait()
}
不断地给人一种恐慌
panic: sync: negative WaitGroup counter
package main
import (
"log"
"sync"
"time"
"github.com/udonetsm/help/helper"
)
type Counter struct {
num int
sync.RWMutex
}
func (c *Counter) Count(wg *sync.WaitGroup, finish, start int) int {
defer helper.PanicCapture("Count")
wg.Add(1)
go func() {
for i := start; i <= finish; i++ {
c.Lock()
c.num += 1
c.Unlock()
log.Println(c.num)
time.Sleep(time.Second)
}
wg.Done()
}()
wg.Wait()
return c.num
}
func New(start int) *Counter {
defer helper.PanicCapture("INIT")
return &Counter{
num: -1,
}
}
func Counting(start, finish int) {
defer helper.PanicCapture("Counting")
c := New(start)
wg := sync.WaitGroup{}
log.Println(c.Count(&wg, finish, start))
}
所以他并不恐慌,他没有正确使用 Wait 。但是不知道有没有看懂counter的结构
首先 - 你正确地制作了计数器的结构
但是你让柜台工作变得非常困难 - 出于某种原因输入了一些 finsih 和 start 。它有一个简单的界面:
Inc()
用于增量和Value()
获取当前值剩下的只是一个竞争环境:有些东西是通过努力工作的,有些东西会考虑这项工作的结果……主要是结果是正确的,也就是说,goroutines 不会在竞争的同时读取状态不要增加(例如,一对/三个 goroutine 没有一次增加计数器
5
状态6
)https://go.dev/play/p/mb9NGCVBC-K