小编Ale*_*Sim的帖子

检查对 C 中 _Generic() 选择的支持

我使用宏泛型选择来“重载”我的自定义库中的一些函数,我想让它尽可能地可移植,所以我试图通过执行以下操作来检查是否存在泛型选择支持

#if ((__STDC_VERSION__>=201112L) || ((__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__)>=40600) || ((__clang_major__*10000+__clang_minor__*100+__clang_patchlevel__)>=30100) || (__xlC__>=0x1201))
Run Code Online (Sandbox Code Playgroud)

(检查底部的编辑说明以查看准确的编译器版本)

由于这些编译器版本应该支持一些 c11 特性,但我实际上不确定这些版本是否真的支持泛型选择;有人可以确认吗?或者有另一种方法吗?

.

.

编辑:支持 _Generic 关键字的编译器版本实际上是:

((__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__)>=40900) || ((__clang_major__*10000+__clang_minor__*100+__clang_patchlevel__)>=30000) || (__xlC__>=0x1201)
Run Code Online (Sandbox Code Playgroud)

c generics gcc clang c11

5
推荐指数
1
解决办法
618
查看次数

ConcurrentHashMap 的compute、computeIfAbsent 和computeIfPresent 方法完全是原子的吗?

整个方法调用是原子的还是只是 BiFunction 执行是原子的?是阻止所有键还是仅阻止同一键上的调用?

java concurrency atomic thread-safety concurrenthashmap

5
推荐指数
1
解决办法
1596
查看次数

stdatomic (C11),关于 _Atomic 类型的三个问题

第一个问题

我在 cppreference 上找到了

  • _Atomic ( type-name ) (自 C11 起)

    用作类型说明符;这指定了一个新的原子类型

  • _Atomic type-name (2)(自 C11 起)

    用作类型限定符;这指定类型名称的原子版本。在此角色中,它可以与 const、volatility 和 limit 混合使用),尽管与其他限定符不同,类型名称的原子版本可能具有不同的大小、对齐方式和对象表示形式。

那么使用_Atomic(int)而不是_Atomic int 保证它的大小相同int或不同吗?

第二个问题

在 Ex 中使用限定符_Atomic

_Atomic(volatile int)
Run Code Online (Sandbox Code Playgroud)

抛出错误,但像这样使用它:

_Atomic(volatile _Atomic(int)*)
Run Code Online (Sandbox Code Playgroud)

才不是; 这是标准行为吗?

最后一个问题

我注意到原子函数(例如:atomic_storeatomic_loadatomic_compare_exchange_weak)可以在传递的类型不为_Atomic类型的情况下工作,并且我仍然可以毫无问题地管理竞争条件。这是标准行为吗?它有缺点或导致任何错误吗?

c types atomic c11

2
推荐指数
1
解决办法
1537
查看次数

标签 统计

atomic ×2

c ×2

c11 ×2

clang ×1

concurrency ×1

concurrenthashmap ×1

gcc ×1

generics ×1

java ×1

thread-safety ×1

types ×1