假定以下代码原子读取然后用写的std ::原子
#include <iostream>
#include <atomic>
#include <chrono>
#include <thread>
std::atomic<uint> val;
void F()
{
while(true)
{
++val;
}
}
void G()
{
while(true)
{
++val;
}
}
void H()
{
while(true)
{
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout <<"val="<< val << std::endl;
val = 0;
}
}
int main()
{
std::thread ft(F);
std::thread gt(G);
std::thread ht(H);
ft.join();
gt.join();
ht.join();
return 0;
}
它基本上是两个线程递增的val
的值和报告该值每秒然后复位它的第三线程。问题是,当第三个线程正在读取此值并将其设置为零时,可能会有可能丢失的增量(我们未将它们包含在报告中)。所以我们需要一个原子读 - 然后写机制。有没有一种干净的方式来做到这一点,我不知道? PS:我不想作任何锁定
也许['std :: atomic :: exchange'](http://en.cppreference.com/w/cpp/atomic/atomic/exchange) –