面试题答案
一键面试Mutex适用场景
- 共享可变数据:当多个线程需要访问并修改同一份数据时,Mutex可用来保证同一时刻只有一个线程能访问和修改数据,防止数据竞争。例如,多个线程对同一个计数器进行累加操作。
- 资源保护:保护有限的系统资源,如文件描述符、数据库连接等。确保同一时间只有一个线程能使用这些资源,避免资源冲突。
Mutex实现线程同步原理
- 内部状态:Mutex内部维护一个布尔值表示锁的状态,初始为未锁定。
- 加锁操作:当一个线程调用
lock
方法时,Mutex会检查锁的状态。如果未锁定,将其设置为锁定状态并返回一个Guard
智能指针,该指针的生命周期与锁的持有时间相关。如果已锁定,调用线程会被阻塞,直到锁被释放。 - 解锁操作:当
Guard
智能指针离开作用域时,其析构函数会自动调用,将锁的状态设置为未锁定,从而唤醒其他等待获取锁的线程。
使用Mutex注意事项
- 死锁风险:如果多个线程以不同顺序获取多个Mutex,可能会导致死锁。例如,线程A获取Mutex1,然后尝试获取Mutex2,而线程B获取Mutex2,然后尝试获取Mutex1,就可能形成死锁。需要小心设计锁的获取顺序来避免。
- 性能问题:频繁加锁解锁会带来一定的性能开销。如果锁的粒度太大(保护的数据范围过大),会导致并发度降低,应尽量减小锁的粒度,只保护真正需要保护的数据。
- 内存安全:Rust的类型系统和所有权规则能确保Mutex使用的内存安全,但要注意避免
Deref
和DerefMut
的滥用,确保在锁的保护下正确访问和修改数据。