class Buffer{
public:
Buffer()=default;
void write(int id) {
std::unique_lock<std::mutex> lck(mtx);
// update data
if (database.find(id) != database.end()) {
std::shared_ptr<Data> data = database.at(id);
data->update(/* something*/);
}
// create new data
else {
std::shared_ptr<Data> new_data = std::make_shared<Data>();
new_data->update(/* something */)
database[id] = new_data;
}
}
shared_ptr<Data> read(int id) {
std::unique_lock<std::mutex> lck(mtx);
std::shared_ptr<Data> data;
// get data if exists
if (database.find(id) != database.end()) {
data = database[id];
}
return data;
}
private:
std::mutex mtx;
std::map<int, shared_ptr<Data>> database;
};
我有一个Buffer类,伪代码在上面.在我的代码中,我有一个线程通过write()
不断写入缓冲区,其他线程通过auto data = buffer.read()
读取缓冲区。
我的问题是:data
将有损坏的性能,因为data
可能是写在另一个线程?
1条答案
按热度按时间nnsrf1az1#
在所提供的代码中,为什么只阻止一个线程的读取操作,读取可以并发完成。下面的代码可以改善读取操作。
所以
write()
函数仍然可以使用std::unique_lock
获取排他锁,以确保一次只有一个线程可以写入。但是
read()
函数使用std::shared_lock
获取共享锁,允许多个线程并发读取。通过使用
std::shared_mutex
,多个线程可以安全地同时从共享资源中读取,但写入需要独占访问。虽然要回答您的问题,即使您当前的代码也不应该有数据损坏,因为
read
和write
中的共享数据都是唯一锁定的。