admin管理员组文章数量:1535569
创作人QQ:851301776,邮箱:[lfr890207@163](mailto:lfr890207@163),欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!
个人座右铭: 1.没有横空出世,只要厚积一定发。 2.你可以学历不高,你可以不上学,但你不能不学习。
一、概念
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行某一段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值和预期的是一样的,就是线程安全的。
线程不安全,是多个线程在同时运行某一段代码的时候,并未提供保护,造成的并未达到预期的结果。
二、线程安全和不安全的本质原因
以count++举例说明:
我们在的代码在执行的时候会被编译成汇编代码,然后变成二进制代码。上图中的代码(count++)是汇编的代码。汇编代码解析,主要分为三个步骤:
(1)CPU从内存中读取count的值到寄存器,并赋值给临时变量。
(2)CPU操作临时变量的值,进行+1操作。
(3)CPU吧临时变量的值写入count对应的内存。
1.为什么会造成线程不安全?
如上图所举例:线程1读取了count的值,CPU切换到线程2,线程2,重新读取了count的值,然后进行操作并写入,此时线程1不重新读取,然后直接操作临时变量并写入。本来count的值相当于+2,但是实际上只是加了1.
2.核心问题
多线程CPU切换造成的
3.解决方式
(1)加锁:互斥锁、尝试锁、自旋锁、读写锁(根据实际场景,所选用不同的锁)。
(2)原子操作
三、总结
我个人总结的是:
线程安全的:本质就是多线程对临界资源的操作,通过加锁等方式,能够达到预期效果。
线程不安全:本质就是多线程对临界资源不做保护,操作之后,无法达到预期的效果。
四、其他
线程安全和不安全,其实有一些特例的,比如无锁CAS等、包括try/catch等,所以需要灵活分析和使用。
版权声明:本文标题:Linux 线程安全和不安全的理解 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1726907293a1089898.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论