首次提交:初始化项目代码
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type node struct {
|
||||
value interface{}
|
||||
next unsafe.Pointer
|
||||
}
|
||||
|
||||
type LockFreeStack struct {
|
||||
top unsafe.Pointer
|
||||
}
|
||||
|
||||
func (s *LockFreeStack) Push(v interface{}) {
|
||||
newNode := &node{value: v}
|
||||
for {
|
||||
oldTop := atomic.LoadPointer(&s.top)
|
||||
newNode.next = oldTop
|
||||
if atomic.CompareAndSwapPointer(&s.top, oldTop, unsafe.Pointer(newNode)) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *LockFreeStack) Pop() (interface{}, bool) {
|
||||
for {
|
||||
oldTop := atomic.LoadPointer(&s.top)
|
||||
if oldTop == nil {
|
||||
return nil, false // 栈空:返回 false
|
||||
}
|
||||
node := (*node)(oldTop)
|
||||
if atomic.CompareAndSwapPointer(&s.top, oldTop, node.next) {
|
||||
return node.value, true // 弹出成功:返回 true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
stack := &LockFreeStack{}
|
||||
var wg sync.WaitGroup
|
||||
const ops = 1000
|
||||
|
||||
wg.Add(2)
|
||||
// 生产者:压入 1000 个元素
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for i := 0; i < ops; i++ {
|
||||
stack.Push(i)
|
||||
}
|
||||
}()
|
||||
|
||||
// 消费者:弹出 1000 个元素
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
count := 0
|
||||
for count < ops {
|
||||
if _, ok := stack.Pop(); ok {
|
||||
count++
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
wg.Wait()
|
||||
|
||||
// 🔑 核心修正:验证栈是否为空
|
||||
_, popped := stack.Pop() // popped = true 表示"成功弹出"(栈非空)
|
||||
if !popped { // !popped = true 表示"弹出失败"(栈已空)✅
|
||||
fmt.Println("✅ 无锁栈验证通过:所有元素正确入栈出栈,栈已空")
|
||||
} else {
|
||||
fmt.Println("❌ 栈非空,存在数据不一致(验证逻辑已修正)")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user