Атомарная (атом от греч atomos — неделимое) операция
Вопрос по поводу атомарных операций
Download 30.44 Kb.
|
Атомарные операции
Вопрос по поводу атомарных операций...
Берем, допустим, инкремент, выполняется следующее: 1)грузим в регистр значение переменной 2)инкрементируем 3)выгружаем из регистра в память Если начинаем делать это из разных потоков, то можем старое значение считывать, это понятно... Однако, с помощью какой магии атомарные типы из разных потоков позволяют такое проворачивать без ошибок? что значит атомарный тип? это свойство определенного типа или это можно гарантировать для любого типа? Ну и код: #include #include #include #include int main() { using namespace std::chrono_literals; //std::atomic //std::atomic long long i = 1; long long ii = 2; std::thread t1([&](){ i++; i--; ii++; }); std::thread t2([&](){ i++; i--; ii++; }); std::thread t3([&](){ i++; i--; ii++; }); std::thread t4([&](){ i++; i--; ii++; }); t1.join(); t2.join(); t3.join(); t4.join(); std::this_thread::sleep_for(100ms); std::cout<} почему что для атомарных типов, что для неатомарных выводится всегда 1 6... не должно же быть такого Библиотека atomic предоставляет компоненты для "мелкозернистых" атомарных операций, позволяя реализовать конкуррентное программирование, свободное от блокировок. Каждая атомарная операция является неделимой по отношению к любым другим атомарным операциям, использующим одн и тот же объект. Атомарные объекы -- единственные в С++, для которых исключается состояние "гонок", то есть, если один поток пишет в атомарный объект, а другой поток читает из него, поведение обоих четко определено.
Download 30.44 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling