2016-10-11 9 views
0

私は多くのスレッドで関数fooラン(std::thread t([&]() { foo(a); })持っている:私は競合状態に対してint xint ystd::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としてxyを定義しvecにプッシュする前std::lock_guard(mutex)を使用します。

またはstd::lock_guard全身ifについては?

それとももっと良い解決策ですか?

+6

個人的には、操作全体がインターリーブされるべきではないように思われるので、私は全体をロックします。 – NathanOliver

+2

'y!= 5'をテストした後、' y = 5'行に達する前に別のスレッドが 'y'を変更しても構わないのですか? – Galik

答えて

0

これは、スレッドが残りの時間に実行している処理(xとyが使用されている)に多少依存しますが、一般的な経験則として、ロックを少なくするほど効果的です。

1

これ以上の文脈がなければ、確かめるのは難しいですが、yを使用して変更しているようですので、割り当て後までifより前にロックする必要があります。それはstd::atomicで行うことはできません。あなたがコードのその領域をミューテックスしているとすれば、xをアトミックにすることから得られる利点はほとんどありません。しかし、あなたは私たちにそれから何かを読んだことを示さなかったので、言うことは難しいです。

関連する問題