面试题答案
一键面试互斥锁确保共享资源安全访问的描述
互斥锁(Mutex,即Mutual Exclusion的缩写)是一种特殊的二元信号量,它只有两种状态:锁定(locked)和解锁(unlocked)。当一个线程想要访问共享资源时,它首先需要获取互斥锁。如果互斥锁处于解锁状态,该线程可以获取锁并将其锁定,然后安全地访问共享资源。当访问完成后,线程必须释放互斥锁,将其状态变回解锁,以便其他线程可以获取锁并访问共享资源。这样可以保证在同一时刻,只有一个线程能够访问共享资源,避免数据竞争等问题。
伪代码实现
// 定义共享资源
shared_resource = 0
// 定义互斥锁
mutex = create_mutex()
// 线程函数
thread_function() {
// 获取互斥锁
lock(mutex)
// 访问共享资源
shared_resource = shared_resource + 1
// 释放互斥锁
unlock(mutex)
}
不使用互斥锁可能出现的问题
- 数据竞争(Data Race):多个线程同时访问和修改共享资源,导致最终结果依赖于线程执行的顺序,出现不可预测的结果。例如,两个线程同时读取共享资源的值为10,然后各自加1,最后共享资源的值应该是12,但由于并发执行,可能最终结果为11。
- 竞态条件(Race Condition):程序的行为依赖于多个线程的相对执行顺序,导致程序出现错误或异常行为。比如多个线程同时向共享的文件写入数据,可能导致文件内容混乱。
- 不一致状态(Inconsistent State):共享资源可能会处于不一致的状态,因为不同线程的部分操作可能被交错执行。例如,一个线程在更新一个复杂数据结构的部分成员时,另一个线程同时访问这个数据结构,可能会看到不完整或错误的状态。