网易首页 > 网易号 > 正文 申请入驻

多线程同步到底在防什么?原子操作、CAS与伪共享详解

0
分享至

写并发代码的时候,听得最多的劝告就是"多线程记得加锁"。但锁只是手段,很多人其实没搞明白:同步到底在防什么?为啥加了锁还会出问题?无锁又是什么玩法?

这篇把线程、同步、原子操作、CAS、内存屏障、伪共享这些概念串起来讲一遍,代码是 C++ 的,但思路语言无关,Java、Go 里同样适用。

先说线程是个啥

线程本质是一个"执行上下文":它有自己独立的执行流、调用栈、错误码、私有数据。Linux 内核里,线程和进程都叫任务(Task),一个执行流就是一条指令序列。

这里有个容易混淆的点:逻辑线程和硬件线程不是一回事。你代码里 new 出来的线程是逻辑线程,它描述的是"做什么、怎么做";而真正干活的是硬件线程——一个 CPU 核心可以支持超线程,1 个核跑 2 个硬件线程,复用一部分执行单元。

线程切换是有代价的,要保存恢复上下文、刷新缓存,切多了反而比串行还慢。所以线程不是越多越好,这也是为什么现在大家都在聊"线程池大小怎么定"。

同步防的是竞态

多线程为啥要同步?因为线程之间会共享内存。举个最常见的例子:消息队列,I/O 线程往里放消息,Work 线程往外取,两边同时操作同一个队列,如果不做任何保护,数据就乱了——你取的时候别人正在写,读到一半的状态。



最朴素的做法就是加互斥锁:操作前 lock,操作完 unlock,保证同一时刻只有一个线程碰队列。互斥锁之外,还有读写锁(读多写少场景)、条件变量(等条件满足再干活)、信号量(控制并发个数)、自旋锁(临界区极短时用,省得线程切换)——一套"同步原语"家族,各有各的适用场景。

从锁到无锁

锁用多了,性能是个问题,而且一不小心就死锁。于是有了更底层的玩法:原子操作。原子操作由 CPU 指令直接保证,要么完整执行要么不执行,中间不会被插一脚。

原子操作之上最经典的是 CAS(Compare And Swap):先比较内存里的值是不是预期的,是就交换成新值,不是就说明被别人改过了,重试。很多"无锁队列""无锁计数器"就是拿 CAS 拼出来的。

无锁(lock-free)的精确定义很多人搞错:它不是说不用锁,而是说任何一个线程被卡住,其他线程还能继续往前走,系统整体吞吐不依赖某个线程的运气。



两个看不见的坑

光知道原子操作还不够,还有两个藏在硬件层面的坑。

一个是乱序执行。编译器和 CPU 为了性能会重排指令,你写的代码顺序,实际执行时可能是另一回事。多线程场景下,这种重排会导致另一个线程看到"不该看到的状态"。解决办法就是内存屏障——告诉 CPU:这里不许乱序,前后的操作必须按顺序来。

另一个是伪共享(False Sharing),这个坑特别隐蔽。CPU 缓存是按 Cache Line 加载的,一般是 64 字节。假设两个线程各写各的变量,但这两个变量恰好挤在同一个 Cache Line 里——表面上互不干扰,实际上两个核的缓存为了保持一致性来回同步,性能直接崩掉。

原文里有个实验特别直观:两个线程往共享内存的不同位置写数据,结果耗时 3.4 秒;把每个线程的数据 padding 到 128 字节、让它们落进不同的 Cache Line 之后,耗时直接降到 0.06 秒——差了 50 多倍,代码逻辑一点没变,只是内存布局变了。



我的建议

说了这么多,最实用的一条反而是:最快的同步就是不同步。能别共享就别共享——用副本、用不可变数据、用队列把并发变成串行处理,都比在共享内存上跳舞省心。

设计优先级大概是:先想能不能无共享,再想能不能无锁,最后才轮到加锁。真到了要加锁那一步,也尽量缩小临界区,别在锁里干重活。

你在项目里踩过伪共享或者死锁的坑吗?评论区聊聊,说不定能帮到正在调并发性能的兄弟。

声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
又一盘7‑5!郑钦文2‑0斯瓦泰克,世界排名第52位,78万刀到手

又一盘7‑5!郑钦文2‑0斯瓦泰克,世界排名第52位,78万刀到手

雅儿姐在遛弯
2026-09-08 14:48:21
比尔·盖茨亲口承认:Ctrl+Alt+Delete是个错误

比尔·盖茨亲口承认:Ctrl+Alt+Delete是个错误

我是一个粉刷匠2
2026-09-07 01:06:52
61岁男演员全家美国享乐!住豪宅开快艇吃龙虾,一句回应点燃舆论

61岁男演员全家美国享乐!住豪宅开快艇吃龙虾,一句回应点燃舆论

娱说瑜悦
2026-09-07 18:32:08
李干杰会见蒙古民主党代表团

李干杰会见蒙古民主党代表团

新华社
2026-09-08 13:00:05
底层的戾气越来越重了

底层的戾气越来越重了

知肇分子
2026-09-07 20:40:32
57岁歌手陈明近况曝光!巅峰时嫁日本人,21岁女儿成为她的骄傲

57岁歌手陈明近况曝光!巅峰时嫁日本人,21岁女儿成为她的骄傲

最美的笔触
2026-09-08 08:57:26
83岁影帝抱3岁女儿,像祖孙!网友大骂自私,孩子妈是华裔武术教练

83岁影帝抱3岁女儿,像祖孙!网友大骂自私,孩子妈是华裔武术教练

头号电影院
2026-09-07 14:25:20
恭喜!她要和圈外男结婚了!

恭喜!她要和圈外男结婚了!

奋斗在韩国
2026-09-07 10:07:10
中埃演习刚结束,法媒爆料埃及将增购阵风,对歼-10、歼-16没兴趣

中埃演习刚结束,法媒爆料埃及将增购阵风,对歼-10、歼-16没兴趣

影孖看世界
2026-09-06 23:51:02
65岁刘德华现状引热议,网友:谁能看出刘德华已经65岁了

65岁刘德华现状引热议,网友:谁能看出刘德华已经65岁了

韩小娱
2026-09-08 08:28:49
2000年,歹徒长途客车起色心,3名女子被强奸5次,43人冷眼旁观!

2000年,歹徒长途客车起色心,3名女子被强奸5次,43人冷眼旁观!

法网恢恢
2026-09-06 23:15:14
张新当选中国羽毛球协会主席

张新当选中国羽毛球协会主席

政知新媒体
2026-09-08 10:50:23
伊朗多枚导弹袭击美航母,美方承认低估了一件事:伊朗已不再忌惮美国

伊朗多枚导弹袭击美航母,美方承认低估了一件事:伊朗已不再忌惮美国

影孖看世界
2026-09-06 21:34:46
刷新历史首人纪录!郑钦文再造奇迹被官方赞如乔丹 赛后立马加练太拼

刷新历史首人纪录!郑钦文再造奇迹被官方赞如乔丹 赛后立马加练太拼

颜小白的篮球梦
2026-09-08 04:46:47
乌克兰恢复攻击!从非洲发射无人机,12次命中炸瘫俄罗斯军火船

乌克兰恢复攻击!从非洲发射无人机,12次命中炸瘫俄罗斯军火船

鹰眼Defence
2026-09-07 15:44:19
郭德纲演出案罚没63.56万,相当于武汉文旅此前全年罚没收入的一半

郭德纲演出案罚没63.56万,相当于武汉文旅此前全年罚没收入的一半

马小白
2026-09-08 09:39:51
大S闺房曝光!太过诡异像灵堂引人不适,难怪大师预言她活不过50岁

大S闺房曝光!太过诡异像灵堂引人不适,难怪大师预言她活不过50岁

瞎说娱乐
2026-08-27 11:09:48
从135到98,肚子瘪下去才明白:内脏脂肪最怕的,从来不是跑步

从135到98,肚子瘪下去才明白:内脏脂肪最怕的,从来不是跑步

健身狂人
2026-09-06 02:07:39
什么样的家庭能教出这样的人!

什么样的家庭能教出这样的人!

张晓磊
2026-09-08 12:20:47
中国男篮重要决定,郭士强任命新一任队长!

中国男篮重要决定,郭士强任命新一任队长!

体育哲人
2026-09-07 16:33:00
2026-09-08 15:20:49
千纸鹤安安
千纸鹤安安
大自然的搬运工
112文章数 3关注度
往期回顾 全部

科技要闻

小米再次背水一战

头条要闻

牛弹琴:特朗普彻底玩嗨了 全世界都大开眼界啧啧称奇

头条要闻

牛弹琴:特朗普彻底玩嗨了 全世界都大开眼界啧啧称奇

体育要闻

韩旭:我一定会再次走出去

娱乐要闻

郭德纲乱改抗战歌曲被重罚!

财经要闻

全球黄金“回家”

汽车要闻

领克20 领克的纯电小钢炮这次更运动了

态度原创

手机
本地
数码
旅游
公开课

手机要闻

拆解曝光麒麟9050Pro!华为Mate XT2三折叠,看看修屏幕多少钱?

本地新闻

扒完小作文,富豪们私藏的度假胜地有多绝

数码要闻

玩家自制Mod复活多GPU架构 实现最高127%帧率暴涨

旅游要闻

曲水亭秋晨:清泉垂柳,市井济南

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版