选用的同步原语
- 互斥锁(Mutex):用于保护共享资源(文件),确保同一时间只有一个线程能对文件进行操作。
- 条件变量(Condition Variable):当某些条件满足时,用于线程间的通知与唤醒。
使用方式
- 互斥锁的使用:
- 在每个文件操作函数(读取、写入、删除)的入口处加锁,在函数结束处解锁。例如,在C++中使用
std::mutex
:
std::mutex fileMutex;
void readFile() {
fileMutex.lock();
// 执行文件读取操作
fileMutex.unlock();
}
void writeFile() {
fileMutex.lock();
// 执行文件写入操作
fileMutex.unlock();
}
void deleteFile() {
fileMutex.lock();
// 执行文件删除操作
fileMutex.unlock();
}
- 条件变量的使用:
- 假设存在一个场景,当文件被写入完成后,需要通知其他等待读取该文件的线程。首先定义一个条件变量和一个用于判断文件是否写入完成的标志位。
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);
// 执行文件读取操作
}
理由
- 互斥锁:能简单有效地防止多个线程同时访问文件,避免数据竞争,保证文件操作的原子性,从而确保文件操作的正确性。
- 条件变量:在需要线程间协作的场景下,如文件写入完成后通知读取线程,条件变量可以让线程在条件不满足时进入等待状态,减少不必要的CPU消耗,提高系统的整体效率。同时结合互斥锁,确保条件变量相关操作的线程安全。