我需要幾乎不斷地以只讀方式迭代一系列結構,但對於每讀取一次1M +,其中一個線程可能會附加一個項目。我認爲使用互斥鎖會在這裏過度殺傷,而且我也在某處讀過讀者鎖定它們自己的缺點。C++中的多線程多讀寫很少數組/向量迭代
我在考慮在std :: vector上使用reserve(),但這個回答Iterate over STL container using indices safe way to avoid using locks?似乎無效。
任何想法可能是最快的?最重要的是讀者能夠儘可能快地和有效地進行迭代,儘可能避免爭用。寫作操作不是時間敏感的。
更新:我的另一個用例是「list」可以包含指針而不是結構體。即,std :: vector。同樣的要求適用。
更新2:假設性例子
全局可訪問:
typedef std::vector<MyClass*> Vector;
Vector v;
v.reserve(50);
讀線程1-10:(這些運行幾乎所有運行的時間)
.
.
int total = 0;
for (Vector::const_iterator it = v.begin(); it != v.end(); ++it)
{
MyClass* ptr = *it;
total += ptr->getTotal();
}
// do something with total
.
.
寫線程11- 15:
MyClass* ptr = new MyClass();
v.push_back(ptr);
這基本上是在這裏發生的。雖然通常只有1-2個讀線程和1-2個寫線程,但線程1-15可以同時運行。
這些向量有多大?他們必須是數組/矢量嗎?你需要內存塊連續性嗎?你可以改變它,即元素列表或1024elements塊列表等元素? – quetzalcoatl 2013-03-13 14:06:04
同時存在的結構數是否有界?他們是否曾經被移除,或是在原地發生了變異,或者您是否真的只是一遍又一遍地讀取相同的值?有多少讀者? – Useless 2013-03-13 14:25:45
@quetzalcoatl向量範圍從2到20個項目,平均值在7左右。它們不需要mem連續性,但我認爲具有連續性可能更適合w.r.t緩存局部性。我願意接受任何建議。 – stgtscc 2013-03-13 15:05:26