В чем проблема двух кодов, которые не могут поддерживать согласованность значений счетчика - PullRequest
0 голосов
/ 15 июня 2019

Вот код ТАС

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(); 
} 

Какова будет проблема каждого кода, который не может обработать последовательность

1 Ответ

0 голосов
/ 15 июня 2019

Предполагая, что FREE == false и BUSY == true, вот поток, который нарушает взаимное исключение:

Start thread 1:
    Increment
        TAS
            rv = *lock; // FREE
Switch to thread 2:
    Increment
        TAS
            rv = *lock; // FREE
            *lock = BUSY;
            return rv; // FREE
        Load value 0 from memory and push it into the stack
Switch to thread 1:
            *lock = BUSY;
            return rv; // FREE
        Load value 0 from memory and push it into the stack
        Push 1 into the stack
        Pop two integers from the stack and add them
        Store the result (0 + 1) into value
Switch to thread 2:
        Push 1 into the stack
        Pop two integers from the stack and add them
        Store the result (0 + 1) into value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...