实现了一套基于 lockfree 的并发安全的数据结构

2022-11-15 21:52:44 +08:00
 wencan

https://github.com/wencan/freesync

https://pkg.go.dev/github.com/wencan/freesync

本项目包含两个部分,freesyn/lockfree 为一套无锁的基础数据结构。freesync 为一套基于无锁基础数据结构的简单复合结构。freesyn/lockfree 完全是 lockfree ,freesync 利用了 sync.Mutex 。

结构 说明 性能
freesync/lockfree LimitedSlice 无锁的长度受限的 Slice
freesync/lockfree SinglyLinkedList 无锁的单链表
freesync/lockfree Slice 无锁的支持增长的 Slice
freesync Slice 并发安全的 Slice 与官方 slice+mutex 相比,写性能提升一半,读性能提升百倍左右
freesync Bag 并发安全的容器 与 sync.Map 相比,写性能提升一半左右

麻烦各路大佬指点。如果能发现 bug 更好。

1612 次点击
所在节点    Go 编程语言
31 条回复
lysS
2022-11-18 12:54:45 +08:00
@tsotsi range 的时候读取是更新前的还是后的,这取决于设计(是整体的并发安全还是对元素的并发安全)。从这个角度来说我那个 ut 不太准确。

但还是那个结论。如果把竞争检测开启,我那个 ut 会有竞争、而你那个 sync.Map 不会有
tsotsi
2022-11-18 14:25:34 +08:00
@lysS 你的代码去掉也不行。哈
建议用我的
https://go.dev/play/p/qyHVGs36Hkn
@wencan
lysS
2022-11-18 17:03:39 +08:00
@tsotsi 去掉也不行什么意思? 我那个是 ut 是证明 op 的那个库是并发不安全的
wencan
2022-11-18 19:26:53 +08:00
@lysS @tsotsi
我重新跑了 freesync.Slice 和 freesync.Bag 的全部 unit test 和 branchmark test ,全部输出符合预期,没检测到 data race 。
tsotsi
2022-11-19 09:42:35 +08:00
@wencan 我的。🤡了
lysS
2022-11-21 16:48:53 +08:00
@wencan 数据竞争是有的,只不过不容易测出来吧。
比如函数 func (slice *Slice) Append(p interface{}) int 中,在互斥锁之前会读 limitSlicesNum ,互斥锁之后会写 limitSlicesNum 。而且这两个是可以同时发生的。
lysS
2022-11-21 16:49:03 +08:00
话说你都加了互斥锁了,那个 slice 的 value 完全没必要用 atomic.Value 了
lysS
2022-11-21 17:06:41 +08:00
还有,我看你里面有自旋,这显然是不太好的
lysS
2022-11-21 17:09:14 +08:00
@wencan L19 最好不存指针大概是这种情况:

func Benchmark_Race(b *testing.B) {

var i int
var at atomic.Value = atomic.Value{}
at.Store(&i)

b.RunParallel(func(p *testing.PB) {
for p.Next() {
*(at.Load().(*int))++
}
})
}
wencan
2022-11-21 19:31:35 +08:00
lockfree.Slice 创建之后,limitSlicesNum 是只读
查了下,slice 的用 value 的地方,都存在并发读写的可能。不知道你说的具体是哪里的 value ?
at.Store(&i)里 &i 不就是地址吗?
@lysS
lysS
2022-11-21 21:56:32 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895512

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX