Часто, задавая эти вопросы, можно не только понять, что такое атомарные переменные, но и представить все возможные сценарии.
Что такое атомарная операция? Это операция, которую нельзя разделить. Это либо сделано, либо не сделано.
Учитывая это, рассмотрите все возможные сценарии.
- Может ли любой из случаев входить в условие if? Нет. Потому что обе переменные
0
, и ничто не превратит их в 1
.
Звучит банально, но это все ваши возможности. Более важный вопрос: почему x или y вообще должны стать 1
? На основе того, что вы предоставили. Нет никаких причин.
РЕДАКТИРОВАТЬ:
Мой единственный комментарий к той презентации, которую вы связали, заключается в том, что она просто неверна. Чтобы доказать это, я использовал эту программу, и кейсы никогда не входили в условия if. Любой, кто читает это, подтвердите, что я говорю, потому что я могу ошибаться. Я запустил эту программу несколько минут, и ничего не произошло (gcc (Debian 6.2.1-5) 6.2.1 20161124)
.
#include <iostream>
#include <atomic>
#include <thread>
std::atomic_int x,y;
void call1()
{
while(true)
{
if(x.load(std::memory_order_relaxed) == 1)
{
std::cout<<"I'm in!"<<std::endl;
y.store(1, std::memory_order_relaxed);
}
}
}
void call2()
{
while(true)
{
if(y.load(std::memory_order_relaxed) == 1)
{
std::cout<<"I'm also in!"<<std::endl;
x.store(1, std::memory_order_relaxed);
}
}
}
int main()
{
x.store(0);
y.store(0);
std::thread t1(call1);
std::thread t2(call2);
t1.join();
t2.join();
return 0;
}
person
The Quantum Physicist
schedule
23.03.2017