我想兩個線程的工作是這樣的:的QList,QVector或std :: vector的多線程使用
- 第一個線程將追加值向量
- 第二個線程將有隻讀元素的訪問權限以索引
我可以在第二個線程開始閱讀之前製作互斥鎖並進行深度複製....但是這種方法真的很慢......如何在沒有互斥鎖的情況下做到這一點?這裏:STL vector and thread-safety 我讀過,它可以使用std :: deque,但它失敗像std :: vector ...
我在哪裏可以找到只附加容器,不重新分配數據?添加元素來支持,獲得大小,通過索引訪問元素:
我已經用行動創造自己的容器GrowVector解決我的問題。它適用於默認值爲2Billion的元素,但可以通過構造函數參數進行更改。
#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];
}
};
我的解決方案是否安全?
如果從多個線程使用標準庫容器並且至少有一個線程正在修改容器,則必須同步對容器的訪問。所有標準庫容器都是這種情況,而不僅僅是'vector'。 – 2012-03-07 07:09:30
不重新分配內存的唯一方法是如果你已經知道向量中的最大條目數量,然後使用'reserve'。或者'std :: array',如果你知道編譯時已經有了大小。也許你想要一個'std :: list'而不是? – 2012-03-07 07:15:34