我想做这个:
union {
std::atomic<uint128_t> u128;
struct {
std::atomic<uint64_t> u64_1;
std::atomic<uint64_t> u64_2;
};
};
Run Code Online (Sandbox Code Playgroud)
几个线程将读取和写入联合的两个部分.
安全吗?
编辑:我使用Linux,x86_64,clang 3.3
Edit2:我希望能够递增和递减u64_1,读取u64_2,并写入u128(compare_exchange)
Edit3:如果我使用原子内置函数怎么办?工会将如下所示:
union {
uint128_t u128;
struct {
uint64_t u64_1;
uint64_t u64_2;
};
};
Run Code Online (Sandbox Code Playgroud)
u64_1将映射到u128的上半部分,u64_2将映射到下半部分.
该std::atomic<T>操作可以是无锁或锁定,这取决于是否架构提供了基本保证.你可以通过检查来检查std::atomic<T>::is_lock_free().
如果类型不是锁定的,则库可能通过计数器支持它.这反过来可能意味着该类型不再是下面的POD,这反过来意味着当从一个活动成员切换到另一个活动成员时,您有责任调用构造函数/析构函数.
如果存在128位但不是64位类型的互斥锁,则可能最终会出现值的布局重合的情况,但操作的原子性通过不同的方式得到保证,因此它似乎可以工作,但是失败虚假地,以一种难以察觉的方式.
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |