私は多くのスレッドで関数foo
ラン(std::thread t([&]() { foo(a); }
)持っている:私は競合状態に対してint x
、int y
とstd::vector<> vec
を保護する必要がのstd ::アトミックとstd :: lock_guardまたは唯一のstd :: lock_guard
void foo(int a)
{
if (x && y != a)
{
++x;
y = a;
vec.push_back(std::chrono::high_resolution_clock::now());
}
}
を。 最適なソリューションは何ですか?
std::atomic
としてx
とy
を定義しvec
にプッシュする前std::lock_guard(mutex)
を使用します。
またはstd::lock_guard
全身if
については?
それとももっと良い解決策ですか?
個人的には、操作全体がインターリーブされるべきではないように思われるので、私は全体をロックします。 – NathanOliver
'y!= 5'をテストした後、' y = 5'行に達する前に別のスレッドが 'y'を変更しても構わないのですか? – Galik