gov*_*r__ 2 c++ multithreading atomic thread-safety
我正在编写多线程套接字类.可以同时从多个线程调用BelowBounds()函数,我需要防止使用互斥锁.这段代码是否是线程安全的?
class UDPSocketHT
{
public:
std::atomic<size_t> m_nSimultaneousRecvCalls;
std::atomic<size_t> m_nPendingOperations;
//...
bool UDPSocketHT::BelowBounds ( )
{
return ( !m_nSimultaneousRecvCalls || ( m_nPendingOperations + 1 <= m_nSimultaneousRecvCalls ) ) ? true : false;
}
}
Run Code Online (Sandbox Code Playgroud)
或者我必须这样写?
bool UDPSocketHT::BelowBounds ( )
{
size_t x = m_nSimultaneousRecvCalls;
size_t y = m_nPendingOperations;
return ( !x || ( y + 1 <= x) ) ? true : false;
}
Run Code Online (Sandbox Code Playgroud)
你的两种选择都不安全.每个原子变量本身都是原子的,但在单个语句中使用其中两个原子变量则不是.
您可以将支票包装在互斥锁中,或者提出使用单个原子的方法.
什么操作std::atomic是原子的?
operator= 以原子方式存储新值
load()或operator T(在表达式中使用)以原子方式读取值
operator++ 以原子方式递增值
compare_exchange_weak/strong 检查并以原子方式设置值
在表达式中使用两个原子不是原子的:a + b将以原子方式读取a,然后b以原子方式读取,但在读取a和读取之间可能发生任何事情b; 到你读的时候b,a已经有了另一个价值.