假定以下代碼原子讀取然後用寫的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) –