(19) 函 _Combine_cas_memory_orders (),该函数似乎是为了给交换和比较操作指定一个合适的内存约束级别。源码如下:
// Finds upper bound of a compare/exchange memory order pair, according to the following partial order:
// 查找上界,根据以下部分顺序比较 / 交换内存订单对
// seq_cst 5
// | |
// acq_rel 4
// / \ / \
// acquire release 2 3
// | | | |
// consume | 1 |
// \ / \ /
// relaxed 0
//
// 下面函数里的二维数组里就是这些内容: _Success 是横坐标,_Failure 是纵坐标
// 0 0 1 2 3 4 5
// 1 1 1 2 4 4 5
// 2 2 2 2 4 4 5
// 3 3 4 4 3 4 5
// 4 4 4 4 4 4 5
// 5 5 5 5 5 5 5
//
// enum class memory_order : int { relaxed0, consume1, acquire2, release3, acq_rel4, seq_cst5 };
inline memory_order _Combine_cas_memory_orders( const memory_order _Success, const memory_order _Failure)
{
static constexpr memory_order _Combined_memory_orders[6][6] = {// combined upper bounds
{memory_order_relaxed, memory_order_consume, memory_order_acquire,
memory_order_release, memory_order_acq_rel, memory_order_seq_cst},
{memory_order_consume, memory_order_consume, memory_order_acquire,
memory_order_acq_rel, memory_order_acq_rel, memory_order_seq_cst},
{memory_order_acquire, memory_order_acquire, memory_order_acquire,
memory_order_acq_rel, memory_order_acq_rel, memory_order_seq_cst},
{memory_order_release, memory_order_acq_rel, memory_order_acq_rel,
memory_order_release, memory_order_acq_rel, memory_order_seq_cst},
{memory_order_acq_rel, memory_order_acq_rel, memory_order_acq_rel,
memory_order_acq_rel, memory_order_acq_rel, memory_order_seq_cst},
{memory_order_seq_cst, memory_order_seq_cst, memory_order_seq_cst,
memory_order_seq_cst, memory_order_seq_cst, memory_order_seq_cst} };
_Check_memory_order(_Success);
_Check_load_memory_order(_Failure);
return _Combined_memory_orders[static_cast<int>(_Success)][static_cast<int>(_Failure)];
}
(20)函数 _Atomic_reinterpret_as (),本函数实现整数类型与指针类型到整数类型的数据转换,且只允许往大的方向转换:
++ 以及:
++ 源代码如下:
(21)函数 _Load_barrier () ,此函数看来是为了为接下来的原子操作,设置内存栅栏,以确保原子操作的实现,源代码如下:
++ 测试结果:
(22)
谢谢