MST

星途 面试题库

面试题:网络编程多线程下如何通过锁机制保证数据一致性

假设你正在开发一个网络服务器,多个线程会同时访问和修改一些共享数据。请详细描述如何使用互斥锁、读写锁等锁机制来保证数据的一致性,并且说明不同锁机制在这种场景下的适用情况及原因。
31.8万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

互斥锁

  1. 使用方式:在每个线程访问和修改共享数据前,先获取互斥锁。例如在C++ 中,使用 std::mutex 类:
std::mutex mtx;
// 共享数据
int sharedData = 0; 

void threadFunction() {
    mtx.lock(); 
    // 访问和修改共享数据
    sharedData++; 
    mtx.unlock(); 
}
  1. 适用场景及原因:适用于读操作和写操作都比较频繁的场景。因为互斥锁保证同一时间只有一个线程能访问共享数据,无论是读还是写,这样能简单有效地保证数据一致性。但缺点是如果读操作远多于写操作,会导致性能下降,因为读操作之间也会相互阻塞。

读写锁

  1. 使用方式:对于读操作,获取读锁,允许多个线程同时读;对于写操作,获取写锁,此时不允许其他线程读或写。在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(); 
}
  1. 适用场景及原因:适用于读操作远多于写操作的场景。读锁允许多个线程同时读取共享数据,提高了读操作的并发性能。而写锁则保证写操作时数据的一致性,因为写操作时会独占共享数据,不允许其他线程读或写。这样在读多写少的场景下能显著提升性能。