gpt4 book ai didi

multithreading - 原子设置位函数: when it is useful for?

转载 作者:行者123 更新时间:2023-12-03 13:19:40 25 4
gpt4 key购买 nike

在Linux中,有一些针对单个位的原子操作的函数,例如:

  void set_bit( int n, void *addr );

我知道,例如,如果写入一个4字节的数字,则可以在写入完成之前由另一个线程读取它。但是,当对单个位设置使用原子性时,我们可以防止什么情况发生?

最佳答案

RAM不可位寻址,因此要仅设置一个字的一位,CPU必须从RAM读取该字,将其设置为1,然后将该字写回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)

关于multithreading - 原子设置位函数: when it is useful for?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28462740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com