gpt4 book ai didi

c++ - 线程安全读取类成员 vector 而不复制

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:27 25 4
gpt4 key购买 nike

假设我有一个类:

class A
{
private:
std::vector<MyObject> history;
std::mutex historyLock;
}

该类初始化了多个线程,这些线程获取互斥量并写入历史 vector 。假设我有另一个类,我想在其中阅读该列表:

class B
{
public:
B(A instanceA)
{
// I want to read the list here in a thread safe way
}
}

我的直觉告诉我在 A 类 中公开一个名为 GetHistory() 的方法,该方法将锁定互斥锁、复制列表并返回拷贝。

有没有办法在不产生复制操作成本的情况下读取 B 类中的列表?

最佳答案

有几种方法可以解决这类问题。一种方法是使用更复杂的结构来存储您的历史记录,例如不可变 vector 。 (不可变 vector 以迭代性能换取廉价拷贝。)但仅使用标准 C++,我认为最简单的方法是向接受回调的类 A 添加一个遍历成员函数模板:

template <class F> void TraverseHistory(F&& callback)
{
std::lock_guard guard{ historyMutex };
for (auto const& item : history)
{
callback(item);
}
}

如果您不想使用函数模板,也可以使用 std::function:

void TraverseHistory(std::function<void(MyObject const&)> const& callback);

另一种选择是将对整个 vector 的引用传递给您的回调。使用这种方法,函数模板将如下所示:

template <class F> void ReadHistory(F&& callback)
{
std::lock_guard guard{ historyMutex };
callback(std::as_const(history));
}

关于c++ - 线程安全读取类成员 vector 而不复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53490864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com