github.com/bruceshao/lockfree@v1.1.3-0.20230816090528-e89824c0a6e9/cursor.go (about)

     1  /*
     2   * Copyright (C) THL A29 Limited, a Tencent company. All rights reserved.
     3   *
     4   * SPDX-License-Identifier: Apache-2.0
     5   *
     6   */
     7  
     8  package lockfree
     9  
    10  import "sync/atomic"
    11  
    12  // cursor 游标,一直持续增长的一个uint64序列
    13  // 该序列用于wg(Write Goroutine)获取对应写入到buffer中元素的位置操作
    14  // 通过使用atomic操作避免锁,提高性能
    15  // 通过使用padding填充的方式,填充前面和后面各使用7个uint64(缓存行填充),避免伪共享问题
    16  type cursor struct {
    17  	p1, p2, p3, p4, p5, p6, p7       uint64
    18  	v                                uint64
    19  	p9, p10, p11, p12, p13, p14, p15 uint64
    20  }
    21  
    22  func newCursor() *cursor {
    23  	return &cursor{}
    24  }
    25  
    26  func (c *cursor) increment() uint64 {
    27  	return atomic.AddUint64(&c.v, 1)
    28  }
    29  
    30  func (c *cursor) atomicLoad() uint64 {
    31  	return atomic.LoadUint64(&c.v)
    32  }
    33  
    34  func (c *cursor) load() uint64 {
    35  	return c.v
    36  }
    37  
    38  func (c *cursor) store(expectVal, newVal uint64) bool {
    39  	return atomic.CompareAndSwapUint64(&c.v, expectVal, newVal)
    40  }