gpt4 book ai didi

C++11 如何在编译时识别原子类型(通过 mtl 或定义)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:25 25 4
gpt4 key购买 nike

我想知道是否有可能确定给定类型是否是原子的(这意味着您可以在没有互斥量的情况下对其执行操作,而不会使自己处于危险之中)。

我想知道是否有一些 atomic(type) 定义可以确定类型是否是原子的。为了创建类似 DEFINE( (int)(do) ); 的东西,它会创建如下伪代码:

   int _do;

#if !atomic(int)
mutex do_mutex;
#endif

void set_do(int do)
{
#if atomic(int)
_do = do;
#else
lock(do_mutex);
_do = do;
#endif
}

如果类型是原子的(如果需要使用 boost),那么有什么方法可以检查 define/mtl 级别。

最佳答案

您不能在预处理时执行此类操作,因为该确定需要有关类型及其名称的语义信息,而这些信息在预处理期间不可用。

模板化 is_atomic<T> type trait 必须由实现提供,但即使在 C++11 中也不可用。它的实用性将非常有限,因为在完全支持线程的平台上,拥有本身是原子的类型是相当不寻常的。

此外,甚至可能无法仅从类型来确定这一点,因为某些类型具有不同的原子性属性,具体取决于它们的内存对齐方式(没有强制要求该类型的原子性对齐要求)。

相反,您应该使用提供的实现 std::atomic<T> ,它应该为给定平台上可用的原子操作(具有给定的内存限制)提供最有效的实现。

通过使用特定于平台的内存栅栏或原子访问指令,即使底层内存模型为“裸” native 类型提供原子性,此类实现也可能能够提供无锁原子类型。

您可以使用 std::atomic<T>::is_lockfree()以确定这样的实现是否需要在后台使用锁。

关于C++11 如何在编译时识别原子类型(通过 mtl 或定义)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com