Met*_*est 5 c linux x86 multithreading multicore
假设一个核心中的线程正在旋转一个变量,该变量将由另一个核心上运行的线程更新.我的问题是缓存级别的开销是多少.等待线程是否会缓存变量,因此在写入线程写入该变量之前不会导致总线上的任何流量?
如何减少这种开销.x86 pause指令有帮助吗?
pause
Nem*_*emo 3
我相信所有现代 x86 CPU 都使用MESI 协议。因此,旋转的“读取器”线程可能会以“独占”或“共享”模式缓存数据副本,在旋转时不会产生内存总线流量。
只有当另一个核心写入该位置时,它才必须执行跨核心通信。
[更新]
只有当您不会旋转很长时间时,这样的“自旋锁”才是一个好主意。如果变量可能需要一段时间才能更新,请改用互斥锁 + 条件变量,这将使线程进入睡眠状态,以便在等待时不会增加任何开销。
(顺便说一句,我怀疑很多人——包括我——都在想“你到底想做什么?”)
归档时间:
14 年,3 月 前
查看次数:
387 次
最近记录:
13 年,9 月 前