线程安全

Generated by claude-sonnet-4-6

线程安全(Thread Safety)是指一段代码或数据结构在多个线程并发访问时,仍能保证行为正确、数据一致,不会因为竞争条件(race condition)导致错误。

核心问题:为什么需要线程安全?

多个线程共享同一块内存。当它们同时读写同一变量时,结果取决于执行顺序——这种不确定性叫竞态条件。

经典例子:两个线程同时对 counter+1

Thread A: 读取 counter = 0
Thread B: 读取 counter = 0
Thread A: 写入 counter = 1
Thread B: 写入 counter = 1   ← 期望是 2,实际是 1

这就是丢失更新(lost update),是线程不安全的典型表现。

实现线程安全的常见手段

互斥锁(Mutex)

同一时刻只允许一个线程访问临界区:

import threading
lock = threading.Lock()

def increment():
    with lock:
        counter += 1  # 受保护

原子操作(Atomic Operations)

硬件层面保证不可分割的操作,无需加锁,性能更好:

// C11 / GCC
atomic_fetch_add(&counter, 1);

不可变数据(Immutability)

只读数据天然线程安全,无需同步。函数式编程鼓励这种风格。

线程局部存储(Thread-Local Storage)

每个线程有自己的变量副本,互不干扰:

local = threading.local()
local.value = 42  # 各线程独立

无锁数据结构(Lock-Free Structures)

利用 CAS(Compare-And-Swap)等原子指令实现,避免锁的开销。

线程安全的三个属性

属性 含义
原子性 操作要么完整执行,要么不执行
可见性 一个线程的修改对其他线程立即可见
有序性 指令执行顺序符合预期(防止编译器/CPU重排)

一个直觉

线程安全的本质是控制共享状态的访问顺序。能不共享就不共享,必须共享时再考虑同步机制。

posted @ 2026-04-01 14:27  Undefined443  阅读(2)  评论(0)    收藏  举报