面试题答案
一键面试互斥锁(mutex)
- 作用:用于保护共享资源,确保同一时间只有一个线程能够访问共享资源,避免数据竞争和不一致问题。
- 使用场景:当多个线程需要访问和修改共享资源时,例如共享变量、数据结构等场景。
读写锁(read - write lock)
- 作用:区分读操作和写操作。允许多个线程同时进行读操作,但只允许一个线程进行写操作,并且写操作时不允许读操作。这样在读取频繁的场景下可以提高并发性能。
- 使用场景:适用于读多写少的场景,比如数据库的查询操作(读)和更新操作(写)。
条件变量(condition variable)
- 作用:用于线程间的同步,一个线程可以等待某个条件满足后再继续执行,而其他线程可以通知这个条件已经满足。
- 使用场景:当线程需要等待某个条件发生后才能继续执行,例如生产者 - 消费者模型中,消费者线程等待生产者线程生产数据。
使用互斥锁保护共享资源示例
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int shared_variable = 0;
void increment() {
for (int i = 0; i < 10000; ++i) {
mtx.lock();
++shared_variable;
mtx.unlock();
}
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Final value of shared_variable: " << shared_variable << std::endl;
return 0;
}
在上述代码中,mtx
是互斥锁,在对 shared_variable
进行修改前,通过 mtx.lock()
锁定互斥锁,确保同一时间只有一个线程能修改 shared_variable
,修改完成后通过 mtx.unlock()
解锁互斥锁。