Здравствуйте. Ребята, накопилось у меня некоторое количество вопросов по многопоточности.
1.
atomic<bool> f{false};
void a(){
  // получаем эксклюзивный доступ
  bool expected = false;
  while(! f.compare_exchange_weak(expected, true, memory_order_relaxed,
                                  memory_order_relaxed)) {expected = false;}
  cout << "mutex lock - ok\n";
  // ... какие-то действия
  // освобождаем мьютекс
  expected = true;
  while(! f.compare_exchange_weak(expected, false, memory_order_relaxed,
                                  memory_order_relaxed)) {expected = true;}
}
int main(){
  thread t1(a);
  thread t2(a);
  t1.join(); t2.join();
}
4) Write-read coherence: if a side effect (a write) X on an atomic object M happens-before a value computation (a read) B of M, then the evaluation B shall take its value from X or from a side effect Y that follows X in the modification order of M
Т.е. чтобы read следовал за write необходимо организовать happens-before, которого сейчас в коде нет?
2. По f.compare_exchange_weak. spuriously fail - что за ерудна такая. Есть ли у меня такая гарантия: если compare_exchange_weak вернула false, то f не была изменена этим вызовом (судя по всему да, но х.з)?
