簡體   English   中英

原子增加和比較線程安全嗎

[英]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 ,但是在讀取ab之間可能發生任何事情; 到您閱讀ba已經可以具有另一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM