Я бы хотел, чтобы две темы работали так:
- Первый поток добавит значения к вектору
- Второй поток будет иметь доступ только для чтения к элементам по индексу
Я могу сделать мьютекс и сделать глубокое копирование до начала чтения второго потока .... Но этот путь действительно медленный ... Как можно сделать это без мьютекса? Здесь: STL вектор и потокобезопасность
Я читал, что можно использовать std :: deque, но он не работает как std :: vector ...
Где я могу найти контейнер только для добавления, который не перераспределяет данные?
Я решил свою проблему, создав собственный контейнер GrowVector с такими операциями: добавление элементов назад, получение размера, доступ к элементу по индексу. По умолчанию он работает для 2 миллиардов элементов, но его можно изменить с помощью параметра конструктора.
#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];
}
};
Мое решение безопасно?