【问题标题】:Incrementor not functioning增量器不工作
【发布时间】:2018-07-30 16:04:46
【问题描述】:

我有一些代码应该增加计数。

这是包含计数变量的结构:

type PipelineData struct {
    nodeData          map[string]map[string]int
    lastBurstResults  map[string]map[string]string
    burstReady        map[string]bool
    lastExecutionTime map[string]time.Time
    currentNodeSize  uint64
}

如您所见,有一个名为currentNodeSize 的成员。此变量旨在每次调用函数addNodeData 时递增。您可以看到函数 addNodeData 调用函数 addCount 然后使用原子增量器。

func (p PipelineData) addNodeData(key string) {
    nodeSlot := clusterScenario.GetNodeSlotByHashSlot(key)
    i:=p.nodeData[nodeSlot][key]
    i++ 
    p.nodeData[nodeSlot][key]=i 
    p.addCount()
    fmt.Println("Adding node count ",p.currentNodeSize)
}

func (p PipelineData) addCount(){
    atomic.AddUint64(&p.currentNodeSize, 1) 
}

不幸的是,当我运行这个时:

p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");
p.addNodeData("{pipelinetest}.key");    
p.addNodeData("{pipelinetest}.key");                
Dump(p.currentNodeSize) 

输出为0

这里是 PipelineData 结构体的初始化:

p = &PipelineData{
  nodeData:make(map[string]map[string]int,0),
  lastBurstResults:make(map[string]map[string]string,0),
  burstReady:make(map[string]bool,0),
  lastExecutionTime:make(map[string]time.Time,0),
  currentNodeSize:0,
}
for i,_ := range clusterScenario.masterNodes{
    p.nodeData[i]=make(map[string]int,0)
}       

我了解社区要求我进行研究。我不知道该怎么做。任何帮助将不胜感激。

我还尝试了一个使用变量的通用增量器,并且产生了相同的结果,这就是我尝试原子增量器的原因

【问题讨论】:

  • 如果不使用原子操作,您将无法安全地读取 currentNodeSize 值。但是这里没有理由使用原子操作,因为调用 addCount 的方法不能安全地同时使用。
  • @JimB 感谢您提供的信息

标签: go increment


【解决方案1】:

addCount 接受一个值接收者,而不是一个指针,因此它对结构的副本进行操作,递增副本的字段,然后丢弃副本。改为获取指针:

func (p *PipelineData) addCount(){

这应该可以解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2022-10-26
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多