原子增加和比较线程安全吗
Is atomic increase and comparsion thread-safe
我正在编写多线程套接字class。 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;
}
}
或者我必须这样写?
bool UDPSocketHT::BelowBounds ( )
{
size_t x = m_nSimultaneousRecvCalls;
size_t y = m_nPendingOperations;
return ( !x || ( y + 1 <= x) ) ? true : false;
}
你的两种选择都不安全。每个原子变量 本身 是原子的,但在单个语句中使用其中两个则不是。
您可以将支票包裹在互斥量中,或者想出一种使用单个原子的方法。
std::atomic
上的哪些操作是原子操作?
operator=
以原子方式存储新值
load()
或 operator T
(在表达式中使用)以原子方式读取值
operator++
自动递增一个值
compare_exchange_weak/strong
检查并自动设置值
在表达式中使用两个原子不是原子的:a + b
将原子地读取 a
,then 原子地读取 b
,但是任何可能发生在阅读 a
和 b
之间;当您阅读 b
时,a
可能已经有了另一个值。
我正在编写多线程套接字class。 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;
}
}
或者我必须这样写?
bool UDPSocketHT::BelowBounds ( )
{
size_t x = m_nSimultaneousRecvCalls;
size_t y = m_nPendingOperations;
return ( !x || ( y + 1 <= x) ) ? true : false;
}
你的两种选择都不安全。每个原子变量 本身 是原子的,但在单个语句中使用其中两个则不是。
您可以将支票包裹在互斥量中,或者想出一种使用单个原子的方法。
std::atomic
上的哪些操作是原子操作?
operator=
以原子方式存储新值load()
或operator T
(在表达式中使用)以原子方式读取值operator++
自动递增一个值compare_exchange_weak/strong
检查并自动设置值
在表达式中使用两个原子不是原子的:a + b
将原子地读取 a
,then 原子地读取 b
,但是任何可能发生在阅读 a
和 b
之间;当您阅读 b
时,a
可能已经有了另一个值。