2016-10-11 57 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原子中获得的利益(这里)几乎没有。但是你没有向我们展示任何东西,所以很难说。

相关问题