[英]Is atomic increase and comparsion thread-safe
我正在編寫多線程套接字類。 可以同時從多個線程調用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
原子, 然后自動讀取b
,但是在讀取a
和b
之間可能發生任何事情; 到您閱讀b
, a
已經可以具有另一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.