![]() |
1
1
根本问题是,即使变量赋值也不是原子操作。困难在于如何在硬件中执行伪代码。大多数计算机使用“加载/存储”架构,其中来自内存的值必须在移动到另一个内存位置之前移动到寄存器中(即没有直接的内存到内存操作)。这引入了一个中间状态(寄存器),在这样的多线程情况下,它可能会把事情搞混。
我假设你会实施
诸如读者行之类的作业
哪里
在您的情况下,问题是一个线程(例如,读取器)的寄存器可能在另一个线程修改内存时保持中间值。当从寄存器存储到内存时,第一个线程(读取器)将覆盖该内存。
考虑以下事件序列。符号
最后两个操作可以并行进行,因此它们将试图同时访问同一插槽。所以你的问题的答案是肯定的,它可能发生。 解决此类问题的一种方法是强制执行 相互排斥 :通过让其他线程等待来确保某段代码不中断。有特殊的硬件指令(如“比较和交换” CMPXCHG )以及用于实现互斥的操作系统特性(如挂起线程执行)。通常,您会使用一些库来为您进行同步,而不会尝试编写自己的技术。例如,请参见 pthread_mutex_lock() 和C的POSIX线程库的pthread_mutex_unlock()。 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 2 年前 |