原子增加和比较线程安全
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
已经可以有另一个值了。
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区