Если потоки обращаются к r
и w
одновременно, они имеют гонку данных.Если в программе на C ++ имеется гонка данных, поведение программы не определено.
int
не гарантируется атомарным стандартом C ++.Даже если мы предположим, что система, в которой доступ к int
является атомарным, operator++
, вероятно, не будет атомарной операцией даже в таких системах.Таким образом, одновременные приращения могут «исчезнуть».
Кроме того, после цикла в write_lock
другой поток также может завершить свой цикл до увеличения w
, тем самым позволяя нескольким одновременным записывающим устройствам - что я предполагаю эту блокировкудолжен предотвратить.
Наконец, это попытка реализовать спин-блокировку.Спинлоки имеют свои преимущества и недостатки.Их недостатком является то, что они блокируют все циклы ЦП своего потока при блокировке.Это крайне неэффективное использование ресурсов, и оно плохо влияет на время работы от батареи, и плохо для других процессов, которые могли бы использовать эти циклы.Но это может быть оптимальным, если время ожидания короткое.