变量只由一个线程读取,由另一个线程读取和写入,需要同步吗? [英] Does a variable only read by one thread, read and written by another, need synchronization?

查看:15
本文介绍了变量只由一个线程读取,由另一个线程读取和写入,需要同步吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

动机:

我只是在学习多线程的基础知识,还没有接近完成它们,但我想在我的学习之旅的早期问一个问题,以指导我进入与我正在从事的项目最相关的主题。

Main:

a.如果一个进程有两个线程,一个线程编辑一组变量,另一个线程只读取这些变量,而不编辑它们的值;那么我们是否需要任何形式的同步来保证读取线程读取的值的有效性?

B.调度这两个线程的操作系统是否可能导致读线程在写线程向同一内存位置写入的同时读取内存位置中的变量,或者这只是一种硬件/总线情况永远不会允许发生,软件设计人员永远不应该关心这一点?如果变量是一个大的结构而不是一个小的int或char呢?

推荐答案

a.如果一个进程有两个线程,一个线程编辑一组变量,另一个线程只读取这些变量,而不编辑它们的值;那么我们是否需要任何形式的同步来保证读取线程读取的值的有效性?

一般来说,。否则,编辑该值的线程可能只在本地更改该值,以便其他线程永远不会看到该值更改。这可能是因为编译器(它可以使用寄存器来读取/存储变量),但也是因为硬件(关于目标平台上使用的缓存一致性机制)。通常,原子变量内存屏障用于执行此类同步。

B.调度这两个线程的操作系统是否可能导致读线程在写线程向同一内存位置写入的同时读取内存位置中的变量,或者这只是一种硬件/总线情况永远不会允许发生,软件设计人员永远不应该关心这一点?如果变量是一个大的结构而不是一个小的int或char呢?

一般来说,不能保证访问是自动完成的。理论上,执行每个线程的两个核心可以同时加载/存储相同的变量(但在实践中通常并非如此)。它非常依赖于目标平台。

对于具有(一致的)高速缓存(即,所有现代主流处理器)缓存线(即通常为64或128字节的块)对线程之间的隐式同步有巨大影响。这是一个复杂的主题,但您可以首先阅读更多关于cache coherence的内容,以便了解内存层次结构在现代平台上是如何工作的。 高速缓存一致性协议防止在同一高速缓存线中准确地同时完成两个加载/存储。如果变量跨越多个缓存线,则没有保护。

在广泛使用的x86/x86-64平台上,基元类型为<;=8字节的变量可以进行原子修改(因为总线支持这一点以及DRAM和缓存),前提是地址正确对齐(它不会跨越缓存线)。然而,这并不意味着所有这样的访问都是原子的。您需要将其指定给编译器/解释器等,这样它才能生成/执行正确的指令。请注意,还有一个用于16字节原子的扩展。还有一个支持事务内存的指令集扩展。对于更宽的类型(或可能的复合类型),您可能需要原子状态来控制对目标变量的访问的原子性。

这篇关于变量只由一个线程读取,由另一个线程读取和写入,需要同步吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆