Я пишу многопоточный класс сокетов. Функция 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;
}
Не связанный с вашим вопросом, но если у вас есть тернарное выражение, приводящее к «истинному» или «ложному», на самом деле нет необходимости в тройном выражении. В вашем последнем примере вы могли бы также написать 'return! X || (y + 1 <= x); ' –