multithreading - 线程可以争用对单个地址的访问权吗?

标签 multithreading memory

取一个 bool 值。一个线程正试图为其分配一个预定值,而与此同时,另一个线程正试图读取它。怎么了?

最佳答案

Take a boolean value. One thread is trying to assign a pre-determined value to it, and at exactly the same time another thread is trying to read it. What happens?



这取决于所讨论的体系结构和语言。实际上,这通常意味着您将具有竞争条件,并且“读取”值可能是旧值或新值。

如果两个线程尝试同时写入同一变量,则更有趣-如果一个线程写入false而另一个写入true,则实际生成的变量可能以任何一个值结束。

为了保证正确的访问,需要设置内存屏障。如果处理多个处理器甚至多个内核,则尤其如此,因为在线程写入后需要使CPU高速缓存行无效,以使单独的线程读取值。大多数语言都以一种或另一种形式对此提供支持-例如,在C#中,您可以将变量标记为volatile来协助完成此任务,但是通常仍需要显式同步(即:锁定)。

另外,如果变量write不是单个CPU指令(即:使用互锁操作或类似操作),则必须注意显式同步读写访问-否则,(在某些体系结构上)您可以在以下位置获取变量:第三,不确定的状态。

关于multithreading - 线程可以争用对单个地址的访问权吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991201/

相关文章:

android - PhoneStateListener 内存泄漏 - android

regex - 在Go中优化正则表达式的内存消耗

multithreading - 阻塞I/O与非阻塞I/O之间是否存在灰色区?

c++ - 与 kill 一起发送到父线程的信号是否保证在下一条语句之前得到处理?

multithreading - Clojure core.async,超时后CPU挂起。无论如何要正确杀死 (go..) block 产生的宏线程?

c# - .NET 中是否可以使用非阻塞、单线程、异步 Web 服务器(如 Node.js)?

java - 用Java管理大矩阵的正确方法

ios - ARCGIS iOS - map 图层内存问题

java - 如何增加Jboss中的Heap和Perm内存?

c++ - sem_wait() 在 linux 上唤醒失败