【发布时间】:2014-01-17 03:33:55
【问题描述】:
【问题讨论】:
-
值从 A 变为 B,然后又变为 A。因此,ABA。 Wikipedia 上的示例已经使用 A 和 B 来描述值。
标签: algorithm terminology
【问题讨论】:
标签: algorithm terminology
ABA 不是首字母缩写词,它是一种简写方式,用于说明某个值 共享位置可以从 A 更改为 B,然后返回 A :)
【讨论】:
假设你有两个线程,一个是检查一个全局字符是否有新数据:
char flag = 'n';
void alarms(){
while(true){
if(flag == 'f'){
start_fire_alarm();
}
/* ... some other things, including some waiting ...*/
}
}
void sensors(){
while(true){
if(sensor_alerts_fire()){
flag = 'f';
} else {
flag = 'n';
}
}
}
现在alarm 检查标志,看到'n',一切都很好。突然,一场大火开始了,sensors 将标志设置为'f'。但是在操作系统给alarm 一些反应时间之前,物理传感器就坏了,它们不再警告火灾。 sensors() 再次将标志设置为'n',操作系统给alarm() 一些时间,但没有任何反应。
这是 ABA 问题(好吧,在我们的例子中是 NFN)。您不会在第一个线程中注意到您的共享值在两者之间发生了变化,尽管这可能很关键。请注意,您可以将 char 与某些原子类型交换,并将所有分配/测试与原子类型交换,问题仍然是相同的。
【讨论】:
据我所知,问题与线程交错有关。所以我认为它是交错的简短文本表示。先运行一个线程A,然后切换到线程B,再回到线程A。
【讨论】: