MST
星途 面试题库

面试题:并发与同步之互斥锁在多线程场景下的应用

在一个多线程程序中,多个线程需要访问共享资源。请描述如何使用互斥锁来确保共享资源的安全访问,并编写一段简单的伪代码实现。同时说明如果不使用互斥锁可能会出现什么问题。
30.3万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

互斥锁确保共享资源安全访问的描述

互斥锁(Mutex,即Mutual Exclusion的缩写)是一种特殊的二元信号量,它只有两种状态:锁定(locked)和解锁(unlocked)。当一个线程想要访问共享资源时,它首先需要获取互斥锁。如果互斥锁处于解锁状态,该线程可以获取锁并将其锁定,然后安全地访问共享资源。当访问完成后,线程必须释放互斥锁,将其状态变回解锁,以便其他线程可以获取锁并访问共享资源。这样可以保证在同一时刻,只有一个线程能够访问共享资源,避免数据竞争等问题。

伪代码实现

// 定义共享资源
shared_resource = 0
// 定义互斥锁
mutex = create_mutex()

// 线程函数
thread_function() {
    // 获取互斥锁
    lock(mutex)
    // 访问共享资源
    shared_resource = shared_resource + 1
    // 释放互斥锁
    unlock(mutex)
}

不使用互斥锁可能出现的问题

  1. 数据竞争(Data Race):多个线程同时访问和修改共享资源,导致最终结果依赖于线程执行的顺序,出现不可预测的结果。例如,两个线程同时读取共享资源的值为10,然后各自加1,最后共享资源的值应该是12,但由于并发执行,可能最终结果为11。
  2. 竞态条件(Race Condition):程序的行为依赖于多个线程的相对执行顺序,导致程序出现错误或异常行为。比如多个线程同时向共享的文件写入数据,可能导致文件内容混乱。
  3. 不一致状态(Inconsistent State):共享资源可能会处于不一致的状态,因为不同线程的部分操作可能被交错执行。例如,一个线程在更新一个复杂数据结构的部分成员时,另一个线程同时访问这个数据结构,可能会看到不完整或错误的状态。