怎么设计一个线程安全的类?有什么原则吗?比如 vector?

2019-05-28 10:49:21 +08:00
 FelixLiu

vector 基本每个方法都保证了原子性,但是组合起来也不一定。

3270 次点击
所在节点    程序员
26 条回复
jimrok
2019-05-28 17:01:37 +08:00
@FelixLiu 要想安全就不要共享数据,并发的线程之间如果用到某些数据,保持只读访问或者把需要的数据打包起来,发给执行任务的线程,处理过程中,修改完数据后,再发送给另外的处理模块。
23571113
2019-05-28 17:11:39 +08:00
组合起来想达到原子性就等于套用数据库的事务原子性的那一套方法,推荐你看一下 2PL 方法。有些无锁(不需要加锁就可以线程安全)的数据结构可能也能满足你的要求,比如 BwTree 这种你可以了解一下。
FelixLiu
2019-05-28 17:21:47 +08:00
@23571113 欧克,了解一波。
mooncakejs
2019-05-28 18:12:51 +08:00
@FelixLiu 我理解:指导下原则就是资源特点和对性能的要求指标是什么。
- 性能要求不高,来个大锁(对象锁)。
- 读多写少,就来读写锁;
- 读写均衡,可以来分区 /分段锁。
- 资源为简单类型,atomic。
- 对更改不敏感,COW & TheadLocal
- 实时性邀请不高,外部队列。
oneisall8955
2019-05-29 01:26:43 +08:00
@skypyb 还有这种说法?。。。
FelixLiu
2019-05-29 09:13:25 +08:00
@mooncakejs 这个总结的挺好,简单明了

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

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

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

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

© 2021 V2EX