请问各位实现线程安全除了加锁还能有啥别的操作

2019-05-28 16:50:57 +08:00
 qyizhong

上周被问到的问题,一下把我问蒙了。问了一下周围的朋友感觉并不是我想要的答案,各位大佬们有好的解答吗

4939 次点击
所在节点    程序员
33 条回复
ryd994
2019-05-28 18:35:05 +08:00
@Moker 不会,线程内部可以保证一致性
协程不能随便交叉读是因为 Python 或 go 作为高级语言,解释权不保证翻译的原子性。表面上是一行代码,实际上可能被翻译成多个 CPU 指令,中间可能被运行环境打断,穿插其他协程的操作。
如果你自己手动实现异步操作,那还是可以保证安全的。因为此时就是单线程程序而已。如果连单线程都不能保证安全的话这 CPU 也就废了。
exonuclease
2019-05-28 20:06:20 +08:00
cas 原子变量 或者干脆不可变数据
luozic
2019-05-28 20:40:24 +08:00
cas cow copy on write。最经典的 java 里面的 juc Doug lea 大佬的代码
zpxshl
2019-05-28 22:06:17 +08:00
rust。。。
billlee
2019-05-28 22:07:53 +08:00
使用 immutable 数据结构, 函数式编程
jimages
2019-05-28 22:13:07 +08:00
戚总好!
实现线程安全的办法有:
1.一种办法是把函数写成无状态的函数,有点类似于函数式编程,这个函数中不使用任何全局变量和静态变量,只使用静态变量。
2.加锁
3.使用原子对象
3.
slanternsw
2019-05-28 22:31:05 +08:00
rust(狗头保命)
beidounanxizi
2019-05-28 23:09:23 +08:00
看看 go 并发模型 总体来说就两种 共享内存 和 CSP?
lusi1990
2019-05-29 09:06:11 +08:00
只读 是线程安全的,只有一个写是线程安全的,多个写才需要考虑线程安全
yellbo1
2019-05-29 09:30:03 +08:00
线程封闭是不是也是线程安全的。。。
qyizhong
2019-05-29 09:42:09 +08:00
谢谢各位,突然知道了好多东西...
iwtbauh
2019-05-29 09:59:56 +08:00
免锁?除去线程本地变量,就只有免锁算法了,比如

RCU 读取-拷贝-更新
免锁队列算法

等等
anyele
2019-06-12 14:25:54 +08:00
1,CAS
2,队列
3,单线程(类似于 redis)

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

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

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

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

© 2021 V2EX