【高并发】32位多核CPU并发读写long型数据为何会出现诡异问题?看完这篇我懂了!...


来自:冰河技术      

写在前面

大冰:小菜童鞋,前几天讲的知识点复习了吗?

小菜:复习了,大冰哥,我回去关注了你的公众号,收藏和转发了你的文章,看了好几遍呢!!

大冰:好的,一定要好好复习啊,今天,我们来分析一个诡异的问题:为何在32位多核CPU上执行long型变量的写操作会出现诡异的Bug问题呢?今天的内容很重要,它能够帮助你更加深刻的理解线程的原子性问题,一定要好好听!

诡异的问题

我们在32位多核CPU的计算机上以多线程的方式读写long类型的共享变量时,线程已经将变量成功写入了内存,但是重新读取出来的数据和之前写入的数据不一致,这到底是为什么呢?

原因分析

其实,造成这个问题的根本原因就是线程的原子性问题,而线程的原子性问题最终的“幕后黑手”是线程切换,如果能够禁用线程切换就能够解决这个问题了!在操作系统层面来看,操作系统做线程切换需要依赖CPU的中断机制,所以说,禁止CPU发生中断就能够禁止线程切换。

这种方案在单核CPU上是可行的,但是并不适合多核CPU。

其实,就分析为何在32位多核CPU上执行long型变量的写操作会出现诡异的Bug问题,我们需要从数据类型占用的存储空间来分析。long型变量是64位的,在32位CPU上执行写操作会被拆分成两次写操作(分别是写高32位和写低32位)。我们可以用下图来表示。

32位单核CPU

在32位单核CPU场景下,同一时刻只有一个线程执行,禁止CPU中断,也就是说,在单核CPU上,操作系统不会重新调度线程,实际上,也就是禁止了线程切换。如果一个线程获取到CPU资源,就可以一直执行下去,直到线程结束为止。在这个线程中,对于long型变量的两次写操作,要么都被执行,要么都没有被执行,两次写操作具有原子性,不会出现写入的数据和读取的数据不一致的情况。

我们可以简单的使用下图来表示32位单核CPU写long型数据这个过程。

由上图我们可以看出,在32位单核CPU中,禁止了线程切换之后,所有的线程都是串行执行的,对于long型变量的两次写操作,要么都被执行,要么都没有被执行,两次写操作具有原子性,不会出现写入的数据和读取的数据不一致的情况。

32位多核CPU

在32位多核CPU场景下,同一时刻,可能有两个甚至更多的线程在同时执行。假设有两个线程分别是线程A和线程B,线程A执行在CPU-01上,线程B执行在CPU-02上,此时,禁用CPU中断,只能保证在每个CPU上执行的线程是连续的,并不能保证同一时刻只有一个线程执行,如果线程A和线程B同时写long型变量的高32位的话,那么,就有可能出现诡异的Bug问题,也就是说,明明已经将变量成功写入内存了,但是重新读取出来的数据却不是自己写入的!!

我们可以简单的使用下图来表示32位多核CPU并发写long型数据这个过程。

由上图我们可以看出,在32位多核CPU中,如果有多个线程同时对long类型的数据进行写操作,即使中断CPU操作,也只能保证在每个CPU上执行的线程是连续的,并不能保证同一时刻只有一个线程执行。如果多个线程同时写long型变量的高32位的话,那么,就有可能出现诡异的Bug问题。

总结

long型变量是64位的,在32位CPU上执行写操作,会被拆分成写高32位和写低32位两部分,如果此时有多个线程同时写long型变量的高32位的话,就有可能出现诡异的Bug问题。

注意:不只是long型变量,在32位多核CPU上并发写64位数据类型的数据,都会出现类似的诡异问题!!!

写在最后

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式软件开发的CPU性能优化涉及到多并发问题。随着科技的进步和嵌入式系统的不断发展,单处理能力已经无法满足需求,因此多技术应运而生。 多技术指的是将多个CPU心集成到一个芯片上,每个心都可以独立地执行任务。通过将任务分配给不同的并发执行,可以提升系统的整体性能。在嵌入式软件开发中,利用多技术进行性能优化主要有以下几个方面。 首先是任务划分和并行化。将系统中的任务划分为不同的子任务,并分配给不同的心进行执行。通过合理的任务分配和并行化设计,可以最大程度地利用多处理器的计算能力。 其次是任务调度和同步。在多系统中,不同的心可能要同时访问共享资源,因此需要进行任务调度和同步。通过合理的调度策略和同步机制,可以避免资源冲突和竞争状况,提高并发执行的效率。 另外,还可以采用并行算法和数据结构。在嵌入式软件开发中,选择适合并行执行的算法和数据结构,可以进一步提高多处理器的性能。例如,可以采用并行搜索算法、并行排序算法等,以及适合多并发访问的数据结构,如并发队列、并发哈希表等。 此外,还可以通过优化指令和数据流,减少数据的移动和拷贝操作。多处理器的性能瓶颈之一是数据在不同心之间的传输和拷贝。通过优化指令和数据流,可以尽量减少数据的移动和拷贝操作,提高多处理器的数据访问效率。 综上所述,嵌入式软件开发的CPU性能优化多并发可以通过任务划分和并行化、任务调度和同步、并行算法和数据结构、优化指令和数据流等方式来实现。这些技术的应用可以提高系统的整体性能,适应日益复杂和高并发的嵌入式应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值