面试题答案
一键面试1. 同步机制设计思路
- 读 - 写锁(Read - Write Lock):因为是多个线程并发读共享数据,只有读操作时不会产生数据不一致问题,所以可以使用读 - 写锁。读 - 写锁允许多个线程同时进行读操作,但只允许一个线程进行写操作,这样在保证数据一致性的同时,能减少锁带来的性能开销。
2. C++标准库工具实现
- C++17引入的
std::shared_mutex
:这是一个读 - 写锁类型。 - 示例代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <shared_mutex>
class SharedData {
public:
int data;
std::shared_mutex mtx;
};
class MyClass {
public:
const SharedData& sharedData;
MyClass(const SharedData& data) : sharedData(data) {}
// 常成员函数
void readData() const {
std::shared_lock<std::shared_mutex> lock(sharedData.mtx);
std::cout << "Reading data: " << sharedData.data << std::endl;
}
};
void threadFunction(const MyClass& obj) {
obj.readData();
}
int main() {
SharedData sharedData;
sharedData.data = 42;
MyClass obj(sharedData);
std::thread threads[5];
for (int i = 0; i < 5; i++) {
threads[i] = std::thread(threadFunction, std::ref(obj));
}
for (auto& thread : threads) {
thread.join();
}
return 0;
}
在上述代码中:
SharedData
类包含共享数据data
和一个std::shared_mutex
实例mtx
。MyClass
的常成员函数readData
使用std::shared_lock
来获取读锁,允许多个线程同时读。- 在
main
函数中,创建多个线程并发调用readData
函数,展示了读 - 写锁的使用方式。通过这种方式,在多个线程并发读取共享数据时,既保证了数据一致性,又减少了锁的性能开销。