我希望两个线程像这样工作:
- 第一个线程会将值附加到向量
- 第二个线程将通过索引对元素进行只读访问
我可以在第二个线程开始读取之前创建互斥体并进行深度复制...但是这种方式真的很慢...如何在没有互斥体的情况下进行此操作?这里:STL向量和线程安全 https://stackoverflow.com/questions/4346742/stl-vector-and-thread-safety我读到可以使用 std::deque,但它像 std::vector 一样失败......
在哪里可以找到不重新分配数据的仅追加容器?
我通过创建自己的容器 GrowVector 和操作解决了我的问题:将元素添加到后面,获取大小,按索引访问元素。默认适用于 20 亿个元素,但可以通过构造函数参数更改。
#include <vector>
template<typename T>
class GrowVector
{
std::vector<std::vector<T> > m_data;
size_t m_size;
public:
GrowVector(int chunks = 32768)
: m_data()
, m_size(0)
{
m_data.reserve(chunks);
m_data.push_back(std::vector<T>());
m_data.back().reserve(1 << 16);
}
void add(const T & value)
{
if (m_data.back().size() == m_data.back().capacity())
{
m_data.push_back(std::vector<T>());
m_data.back().reserve(1 << 16);
}
m_data.back().push_back(value);
m_size++;
}
size_t size() const
{
return m_size;
}
T & operator [] (int i)
{
return m_data[i >> 16][i & 0xffff];
}
const T & operator [] (int i) const
{
return m_data[i >> 16][i & 0xffff];
}
};
我的解决方案安全吗?
QList
and QVector
是可重入的,因此只要您在线程一处于活动状态时从不读取最后一个条目(这样您就不会在写入过程中获得值),并且始终使用at()
在第二个线程中(因此不会发生深层复制,这可以避免增长重新分配的问题)你应该没问题。
否则你需要同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)