gpt4 book ai didi

c - 假设 pid_t 始终是 int 类型(如标准中所定义)是否安全?

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:30 24 4
gpt4 key购买 nike

我想自动比较和交换 pid_t 变量。我在标准中读到它是 int 类型。

我知道 atomic_compare_exchange_strong_explicit() 可以自行管理。我需要做的就是将类型设置为 _Atomic(pid_t)。

但是因为我在 macOS 上工作,所以我想让它也与 OSX 旧库兼容,即 libkern/OSAtomic.h这需要知道类型的类型和大小才能对其进行 CAS。

就像 size_t 的情况一样,我可以简单地做,

#   ifdef __LP64__
# define CAS_size_t(old, new, mem) \
OSAtomicCompareAndSwap64((int64_t) (*old), (int64_t) (new), (volatile int64_t *) (mem))
# else
# define CAS_size_t(old, new, mem) \
OSAtomicCompareAndSwap32((int32_t) (*old), (int32_t) (new), (volatile int32_t *) (mem))
# endif

但是对于 pid_t 我不确定,因为即使未定义 __LP64__ 那么它也可以是 int64_t、int32_t、int16_t 或其他什么?

最佳答案

只需检查宏中值的大小:

#define OSAtomicCompareAndSwap(old, new, mem)  do{ \
if (sizeof(*old) == sizeof(int32_t)) { \
OSAtomicCompareAndSwap32((int32_t)(*old), (int32_t) (new), (volatile int32_t *) (mem)); \
} else if (sizeof(*old) == sizeof(int64_t)) { \
OSAtomicCompareAndSwap64((int64_t)(*old), (int64_t) (new), (volatile int64_t *) (mem)); \
} else assert(0); }while(0)

无论如何,编译器应该优化检查。它不是类型检查(为此我们需要 C++-ish typeid),只检查大小。

如果你需要返回一个值,如果你认为你需要传递另一个变量:

#define OSAtomicCompareAndSwap(ret, old, new, mem)  do{ \
if (sizeof(*old) == sizeof(int32_t)) { \
ret = OSAtomicCompareAndSwap32((int32_t)(*old), (int32_t) (new), (volatile int32_t *) (mem)); \
} else if (sizeof(*old) == sizeof(int64_t)) { \
ret = OSAtomicCompareAndSwap64((int64_t)(*old), (int64_t) (new), (volatile int64_t *) (mem)); \
} else assert(0); }while(0)

或前。传递一个指向变量的指针,以便与结果等进行 memcpy-ied。或者你可以使用 statement expression海合会扩展。

使用如下所示的语句表达式:

#define OSAtomicCompareAndSwap(old, new, mem)  __extension__({ \
int64_t ret = 0; \
if (sizeof(*old) == sizeof(int32_t)) { \
ret = OSAtomicCompareAndSwap32((int32_t)(*old), (int32_t) (new), (volatile int32_t *) (mem)); \
} else if (sizeof(*old) == sizeof(int64_t)) { \
ret = OSAtomicCompareAndSwap64((int64_t)(*old), (int64_t) (new), (volatile int64_t *) (mem)); \
} else { \
assert(0); \
} \
ret; \
})

关于c - 假设 pid_t 始终是 int 类型(如标准中所定义)是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56345432/

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