MST

星途 面试题库

面试题:操作系统并发与同步之复杂场景分析

假设在一个多线程的文件系统操作场景中,多个线程可能同时对文件进行读取、写入和删除操作。请设计一个同步策略,确保文件操作的正确性和高效性,详细说明所选用的同步原语以及它们的使用方式和理由。
33.5万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

选用的同步原语

  1. 互斥锁(Mutex):用于保护共享资源(文件),确保同一时间只有一个线程能对文件进行操作。
  2. 条件变量(Condition Variable):当某些条件满足时,用于线程间的通知与唤醒。

使用方式

  1. 互斥锁的使用
    • 在每个文件操作函数(读取、写入、删除)的入口处加锁,在函数结束处解锁。例如,在C++中使用std::mutex
std::mutex fileMutex;
void readFile() {
    fileMutex.lock();
    // 执行文件读取操作
    fileMutex.unlock();
}
void writeFile() {
    fileMutex.lock();
    // 执行文件写入操作
    fileMutex.unlock();
}
void deleteFile() {
    fileMutex.lock();
    // 执行文件删除操作
    fileMutex.unlock();
}
  1. 条件变量的使用
    • 假设存在一个场景,当文件被写入完成后,需要通知其他等待读取该文件的线程。首先定义一个条件变量和一个用于判断文件是否写入完成的标志位。
std::condition_variable fileWriteCV;
std::mutex cvMutex;
bool fileWritten = false;

void writeFile() {
    std::unique_lock<std::mutex> lock(fileMutex);
    // 执行文件写入操作
    fileWritten = true;
    lock.unlock();
    fileWriteCV.notify_all(); // 通知所有等待的线程
}

void readFile() {
    std::unique_lock<std::mutex> lock(cvMutex);
    fileWriteCV.wait(lock, []{ return fileWritten; });
    std::unique_lock<std::mutex> fileLock(fileMutex);
    // 执行文件读取操作
}

理由

  1. 互斥锁:能简单有效地防止多个线程同时访问文件,避免数据竞争,保证文件操作的原子性,从而确保文件操作的正确性。
  2. 条件变量:在需要线程间协作的场景下,如文件写入完成后通知读取线程,条件变量可以让线程在条件不满足时进入等待状态,减少不必要的CPU消耗,提高系统的整体效率。同时结合互斥锁,确保条件变量相关操作的线程安全。