单核并发是不是不会产生"线程不安全”的问题?

2017-06-26 11:28:18 +08:00
 guyeuro

单核下 一个 CPU 核执行并发,在微观上来看还是串行的 这样是不是不会导致”线程不安全“? 只有多核并发才会导致线程不安全?

8123 次点击
所在节点    问与答
40 条回复
mokeyjay
2017-06-26 11:42:52 +08:00
…你是不是没有搞懂线程和并发的区别?
guyeuro
2017-06-26 11:55:42 +08:00
@mokeyjay 哪里没有搞懂?
bazingaterry
2017-06-26 12:00:39 +08:00
锁这玩意,可比多核 CPU 早设计出来...
hjc4869
2017-06-26 12:00:58 +08:00
会,你的非线程安全的代码执行了一半,这时一个时钟中断信号来了,切到别的线程去了,然后另一个线程就把你这个线程用的变量破坏了
clearbug
2017-06-26 12:01:49 +08:00
啥是并发?
啥是并行?
啥是线程安全?
楼下来解释
zwzmzd
2017-06-26 12:05:39 +08:00
单核异步?所有代码块都是先后执行的,不存在同时执行两个代码块的问题,块内不用考虑线程安全问题。

但实际中,为了性能考虑代码块的粒度都会尽量的小,还是会碰到相似问题
zwzmzd
2017-06-26 12:08:00 +08:00
@zwzmzd 发现看错题意了。
即使单 cpu,操作系统也会按时间分片模拟出多核并发的效果,所以假设是不成立的
maxxxxx
2017-06-26 12:08:25 +08:00
实际上很多下游开发者是没有多核概念的。
Lonely
2017-06-26 12:53:11 +08:00
去搞清楚概念再来,好吗?
wwqgtxx
2017-06-26 13:40:09 +08:00
除非你的单核并发是不允许抢占式的,否则一样会产生线程不安全

举个简单的例子,程序 1 执行 i++,程序 2 也执行 i++
当程序 1 将 i 值读取出来并运算后改为写入的时候,系统抢占式把控制权给个程序 2,程序 2 完整的执行完了 i++,随后系统将控制权交回给程序 1,此时的程序 1 并不知道自己被打断了,也不知道 i 已经被修改,还把之前计算好的值写入,最后结果就是 i 只加了 1,而不是加了 2
momocraft
2017-06-26 13:51:49 +08:00
如果你不做保证线程安全的事,就没什么东西是线程安全
hand515
2017-06-26 13:57:33 +08:00
无法保证一段代码执行的原子性
gogohigh
2017-06-26 14:02:56 +08:00
Concurrent 和 Parallel 是两个概念
SKull4
2017-06-26 14:09:32 +08:00
应该不是科班的
blackjar
2017-06-26 14:56:48 +08:00
你应该是混淆了并发跟并行 并发在只是 cpu 时序有交叉
facetest
2017-06-26 15:46:08 +08:00
建议先补补基础知识
20015jjw
2017-06-26 18:06:42 +08:00
@wwqgtxx 两个程序之间不能互相 access 内存吧 操作系统的虚拟内存不就 是为了避免这件事情发生的吗...
yushiro
2017-06-26 18:39:15 +08:00
@20015jjw 同一个程序的不同代码块可以啊,比如电子商城购买虚拟物品,同时扣款的例子,就是那个 i++的实际案例
stephenyin
2017-06-26 18:53:31 +08:00
@20015jjw 考虑单进程多线程的情况!
hjc4869
2017-06-26 19:17:02 +08:00
@20015jjw 两个进程可以共享内存啊

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

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

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

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

© 2021 V2EX