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 }