面试题答案
一键面试- 选择的同步机制
- 互斥锁(
std::mutex
):用于保护共享数据结构的临界区,确保同一时间只有一个线程可以访问和修改共享的图结构。原因是它简单直接,能有效防止多个线程同时访问共享资源,避免数据竞争。 - 条件变量(
std::condition_variable
):当某个线程需要等待共享数据结构满足特定条件时使用,比如等待图结构中某个节点被其他线程处理完成。它与互斥锁配合使用,能减少线程的无效等待,提高性能。
- 互斥锁(
- 实现思路
- 使用互斥锁:
- 定义一个全局的
std::mutex
对象,例如std::mutex graphMutex;
。 - 在每个需要访问和修改共享图结构的函数中,使用
std::lock_guard<std::mutex>
来自动管理锁的生命周期。例如:
- 定义一个全局的
- 使用互斥锁:
void modifyGraph() {
std::lock_guard<std::mutex> lock(graphMutex);
// 这里进行对共享图结构的修改操作
}
- 使用条件变量:
- 定义一个全局的
std::condition_variable
对象,例如std::condition_variable graphCondition;
。 - 当一个线程需要等待某个条件时,先获取互斥锁,然后使用
std::unique_lock<std::mutex>
与条件变量配合。例如,假设共享图结构中有一个成员变量bool nodeProcessed
表示某个节点是否处理完成:
- 定义一个全局的
void waitForNode() {
std::unique_lock<std::mutex> lock(graphMutex);
graphCondition.wait(lock, [] { return nodeProcessed; });
// 当条件满足,即节点处理完成后,继续执行相关操作
}
- 在修改共享图结构并满足某个条件时,通知等待的线程:
void processNode() {
std::lock_guard<std::mutex> lock(graphMutex);
// 处理节点
nodeProcessed = true;
graphCondition.notify_one();// 通知一个等待的线程
// 或者 graphCondition.notify_all();通知所有等待的线程
}
这样通过互斥锁保证数据访问的互斥性,通过条件变量实现线程间的同步,在保证数据一致性和线程安全的同时,尽可能提高性能。