Здравствуйте. Ребята, накопилось у меня некоторое количество вопросов по многопоточности.
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 не была изменена этим вызовом (судя по всему да, но х.з)?