`int`是否为原子类型?为何锁示例常用`int`计数器?
疑问:为何GNU称int和指针是原子类型,但锁示例仍用int计数器?
引用GNU文档:
实际上,你可以认为int是原子类型。你也可以认为指针类型是原子类型,这非常方便。GNU C库支持的所有机器以及我们所知的所有POSIX系统都满足这两个假设。
这是怎么回事?我见过的所有与锁相关的示例都使用int计数器。
核心区别:原子操作 vs 复合操作
GNU文档里提到的原子类型,指的是针对这类类型的单一读写操作具备原子性——在多线程环境下,一个线程对int或指针的单次读/写动作不会被其他线程打断,不会出现读取到半更新状态值的情况。
但锁示例中的int计数器,往往涉及的是复合操作:比如常见的counter++,本质是「读取当前值→加1→写回新值」三个独立步骤的组合。哪怕int本身的单次读写是原子的,这整个复合流程也不具备原子性——如果两个线程同时执行该操作,极大概率会出现竞态条件,导致最终计数结果不符合预期。
总结
- 单一的int/指针读写:依赖硬件特性,在主流POSIX和GNU支持的系统上是原子的,无需额外加锁。
- 多步骤的复合操作:即便操作对象是int,也需要锁或者原子指令(比如C11标准
stdatomic.h中的原子操作函数)来保证线程安全——这就是锁示例里使用int计数器的核心原因:它们要保护的是复合操作的原子性,而非int本身的读写。
内容的提问来源于stack exchange,提问作者Baltasar del Sol de Haro
相关产品推荐
相关产品推荐

