一个关于原子操作的问题...
让我们以增量为例,执行以下操作:
1)грузим в регистр значение переменной
2)инкрементируем
3)выгружаем из регистра в память
如果我们从不同的线程开始这样做,那么我们可以读取旧值,这是可以理解的......
然而,来自不同线程的原子类型有什么魔力可以让这一切无误地完成呢?原子类型是什么意思?它是特定类型的属性还是可以保证任何类型?
嗯,代码:
#include <iostream>
#include <atomic>
#include <thread>
#include <chrono>
int main()
{
using namespace std::chrono_literals;
//std::atomic<long long> i{1};
//std::atomic<long long> ii{2};
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<<i<<" "<<ii;
}
为什么对于原子类型,对于非原子类型,它总是输出 1 6 ...它不应该是那样的
您没有给任何机会 :) - 这么短的线程将有时间做所有事情并在不切换的情况下完成。
例如,
给出类似的东西
我们更改为原子 - 我们得到(有明显的延迟)
全清?