互斥锁
- 使用方式:在每个线程访问和修改共享数据前,先获取互斥锁。例如在C++ 中,使用
std::mutex
类:
std::mutex mtx;
// 共享数据
int sharedData = 0;
void threadFunction() {
mtx.lock();
// 访问和修改共享数据
sharedData++;
mtx.unlock();
}
- 适用场景及原因:适用于读操作和写操作都比较频繁的场景。因为互斥锁保证同一时间只有一个线程能访问共享数据,无论是读还是写,这样能简单有效地保证数据一致性。但缺点是如果读操作远多于写操作,会导致性能下降,因为读操作之间也会相互阻塞。
读写锁
- 使用方式:对于读操作,获取读锁,允许多个线程同时读;对于写操作,获取写锁,此时不允许其他线程读或写。在C++ 中,可以使用
std::shared_mutex
类:
std::shared_mutex rwMutex;
int sharedData = 0;
void readThreadFunction() {
rwMutex.lock_shared();
// 执行读操作
int dataCopy = sharedData;
rwMutex.unlock_shared();
}
void writeThreadFunction() {
rwMutex.lock();
// 执行写操作
sharedData++;
rwMutex.unlock();
}
- 适用场景及原因:适用于读操作远多于写操作的场景。读锁允许多个线程同时读取共享数据,提高了读操作的并发性能。而写锁则保证写操作时数据的一致性,因为写操作时会独占共享数据,不允许其他线程读或写。这样在读多写少的场景下能显著提升性能。