Linux中有各个位的原子操作函数,例如:
void set_bit( int n, void *addr );
我理解,例如,如果写一个4字节的数字,它可以在写完成之前由另一个线程读取。但是,当使用单一位设置的原子性时,我们会阻止什么情况?
答案 0 :(得分:2)
RAM不可位寻址,因此要设置一个字的单个位,CPU必须从RAM读取字,设置该位,然后将字写回RAM。这是两个连续的操作(如果我们计算OR指令,则为三个),因此它们不是自然原子的。
关于通过使操作成为原子可以防止什么情况,假设存储器中的位置当前具有值0.线程A想要在第二低位中进行OR,并且线程B想要在最低位中进行OR 。如果操作是原子操作,那么预期的结果是,在完成所有操作之后,该字将设置其两个最低位。
但想象一下两个线程'时机不吉利,事情按此顺序发生......
- Thread A reads the word's value (0x00) from RAM
- Thread B reads the word's value (still 0x00) from RAM
- Thread A computes a new value (0x02) by OR'ing its bit
- Thread B computes a new value (0x01) by OR'ing its bit
- Thread A writes its new value (0x02) to RAM
- Thread B writes its new value (0x01) to RAM
- The word's value in RAM is now 0x01, which isn't what we wanted (we wanted 0x03)