Блокировка простого чтения и записи - PullRequest
0 голосов
/ 20 марта 2019

Я нахожу, что реализация чтения и записи Spin-блокировки через Интернет неоправданно сложна.Я написал простую блокировку чтения-записи на c ++.

Может кто-нибудь сказать мне, если я что-то упустил?

int r = 0;
int w = 0;

read_lock(void) 
{
     atomic_inc(r); //increment value atomically
     while( w != 0);    
}

read_unlock(void)
{
   atomic_dec(r); // Decrement value atomically
}
write_lock(void)
{
 while( (r != 0) && 
            ( w != 0))
  atomic_inc(w); //increment value atomically
}

write_unlock(void)
{
    atomic_dec(w); //Decrement value atomically
}

Использование будет таким, как указано ниже.

read_lock()
// Critical Section
read_unlock();

write_lock()
// Critical Section
write_unlock();

Редактировать:

Спасибо за ответы.Теперь я изменил ответ на атомный эквивалент

1 Ответ

3 голосов
/ 20 марта 2019

Если потоки обращаются к r и w одновременно, они имеют гонку данных.Если в программе на C ++ имеется гонка данных, поведение программы не определено.

int не гарантируется атомарным стандартом C ++.Даже если мы предположим, что система, в которой доступ к int является атомарным, operator++, вероятно, не будет атомарной операцией даже в таких системах.Таким образом, одновременные приращения могут «исчезнуть».

Кроме того, после цикла в write_lock другой поток также может завершить свой цикл до увеличения w, тем самым позволяя нескольким одновременным записывающим устройствам - что я предполагаю эту блокировкудолжен предотвратить.


Наконец, это попытка реализовать спин-блокировку.Спинлоки имеют свои преимущества и недостатки.Их недостатком является то, что они блокируют все циклы ЦП своего потока при блокировке.Это крайне неэффективное использование ресурсов, и оно плохо влияет на время работы от батареи, и плохо для других процессов, которые могли бы использовать эти циклы.Но это может быть оптимальным, если время ожидания короткое.

...