请描述在并发编程中,哪些具体场景更适合使用锁,哪些场景更适合使用原子变量?请结合 C++ 并发编程的实践经验,说明两者的适用条件和选择依据。
考察说明
考察对并发同步原语的理解,能否根据场景正确选择锁或原子变量。
回答思路
- 【回答框架 1】锁适用于需要保护临界区、保证多个操作的原子性或涉及复杂条件判断的场景,例如多线程访问共享容器、需要事务性操作或需要等待条件满足时。
- 【回答框架 2】原子变量适用于简单的、单一变量的读写操作,且操作本身可映射为硬件支持的原子指令,如递增计数器、状态标志位切换等。
- 【回答框架 3】选择依据:若操作涉及多个变量或需要复合操作,应使用锁;若只是单一变量的无锁更新,优先考虑原子变量以减少开销。
- 【回答框架 4】还需考虑性能影响:原子变量通常比锁轻量,但在高竞争下可能导致缓存行乒乓;锁可能引起线程阻塞和上下文切换,需权衡。
- 【关键点 1】锁保护临界区,适合复杂操作和条件同步。
- 【关键点 2】原子变量适合简单、独立的变量更新。
- 【关键点 3】选择时考虑操作复杂度和性能要求。
- 【易错点 1】不要误以为原子变量能完全替代锁,复合操作如 compare-and-swap 循环可能仍需锁保护。
- 【易错点 2】避免在持有锁时执行耗时操作,以免影响并发性能。