Вот код ТАС
boolean TAS(*target)
{
boolean rv = *target; //Save the initial value
*target = true; //Set lock
return rv; //Return initial value
}
Следующие коды означают две разные попытки для операции приращения на поточно-безопасном счетчике с использованием tas для поддержания согласованности значения счетчика.
код 1.
Counter::Increment() {
while (TAS(&lock)) ;
value++;
lock = FREE;
memory_barrier();
}
код 2.
Counter::Increment() {
while (lock == BUSY && TAS(&lock)) ;
value++;
lock = FREE;
memory_barrier();
}
Какова будет проблема каждого кода, который не может обработать последовательность