(17) 函 _Check_memory_order (),当前的内存序只有这几种,不属于当前范围的就报错,此函数会给一个报错,并终止进程:
++ 测试:
(18) _Check_store_memory_order () 与 _Check_load_memory_order () , 这俩函数就是检查给读写操作制定的内存约束的类型,不合适则终止进程:
// enum class memory_order : int { relaxed0, consume1, acquire2, release3, acq_rel4, seq_cst5 };
inline void _Check_memory_order(const memory_order _Order) noexcept
{
// check that _Order is a valid memory_order 检查形参 _Order 是否为有效的内存序
if (static_cast<unsigned int>(_Order) > static_cast<unsigned int>(memory_order_seq_cst))
_INVALID_MEMORY_ORDER; // 报错的意思
// #define _INVALID_MEMORY_ORDER = _STL_REPORT_ERROR("Invalid memory order")
}
// enum class memory_order : int { relaxed0, consume1, acquire2, release3, acq_rel4, seq_cst5 };
inline void _Check_store_memory_order(const memory_order _Order) noexcept
{
switch (_Order) // 顾名思义:检查写的内存序
{
case memory_order_relaxed: // 最宽松的内存顺序约束,叫自由序 0
case memory_order_release: // 发布 与 acquire 配合使用,叫获取释放序,被允许 3
case memory_order_seq_cst: // 最严格,顺序一致性。被允许 5
// nothing to do
break;
case memory_order_consume: // 太复杂,已被 c++17 弃用 1
case memory_order_acquire: // 接收 2
case memory_order_acq_rel: // 同时具备 rel 和 acq 的功能 4
default:
_INVALID_MEMORY_ORDER; // 后三种内存序,不准被用于写
break;
}
}
inline void _Check_load_memory_order(const memory_order _Order) noexcept
{
switch (_Order) // 顾名思义:检查读操作的内存序
{
case memory_order_relaxed: // 允许 0
case memory_order_consume: // 允许 1
case memory_order_acquire: // 允许 2
case memory_order_seq_cst: // 允许 5
// nothing to do
break;
case memory_order_release:
case memory_order_acq_rel:
default:
_INVALID_MEMORY_ORDER;
break;
}
}
(19)
谢谢