それは基本的にval
の値と、それをリセットし、この値を毎秒を報告する第三のスレッドをインクリメントする二つのスレッドであり、次のコードは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;
}
と仮定する。問題は、3番目のスレッドがこの値を読み取ってから0に設定すると、失われる可能性のあるインクリメントがある可能性があります(レポートにインクルードしていない)。だから我々は、原子の読み取りと書き込みのメカニズムが必要です。私が気付いていないこれを行うためのきれいな方法がありますか? PS:私はstd::atomic::exchange
方法は、あなたが(強調鉱山)後にしているもののようです何
おそらく['std :: atomic :: exchange'](http://en.cppreference.com/w/cpp/atomic/atomic/exchange) –