2016-10-11 63 views
0

我有許多線程函數foo運行(std::thread t([&]() { foo(a); }):的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()); 
    } 
} 

我需要保護int xint ystd::vector<> vec對競爭條件。 什麼是最佳解決方案。

定義xystd::atomic,推動以vec之前使用std::lock_guard(mutex)

std::lock_guardif聲明的全身?

或者也許有更好的解決方案?

+6

就個人而言,我會鎖定整個事情,因爲整個操作看起來應該不是交錯的。 – NathanOliver

+2

在測試'y!= 5'之後,你是否介意另一個線程在你到達'y = 5'行之前是否改變'y'? – Galik

回答

0

這在某種程度上取決於線程在其餘時間使用x和y的情況,但作爲一般的經驗法則,您做的鎖越少越好。

1

如果沒有更多的上下文,很難確定,但看起來您正在使用和修改y,因此您可能需要將其從if之前鎖定,直到分配後。這不能用std::atomic完成。考慮到你對代碼的區域進行了無聲處理,那麼從x原子中獲得的利益(這裏)幾乎沒有。但是你沒有向我們展示任何東西,所以很難說。

相關問題