我一直在困惑於我寫的多線程應用程序的問題。簡而言之,主線程啓動一個熱負載線程,該線程接受文件對象的列表(向量),檢查其時間戳,並將更改的文件傳遞給另一個向量。在多線程應用程序中使用向量
當我嘗試將新文件添加到需要檢查的文件列表時,會發生此問題。熱加載線程不斷檢查其列表中的文件以進行更改,並在迭代時使用範圍鎖定來鎖定/解鎖互斥鎖。同樣,當主線程調用addItems()函數時,同樣的互斥鎖也同樣被鎖定,並添加新文件。
我讀過的信息說這應該罰款給予適當的鎖定,它確實有效,但我經歷了一個非常大的減速作爲結果。也就是說,如果我連一個文件添加到列表中,該計劃不斷減慢,彷彿線程越來越鎖定...
代碼:
void MyThread::addItems(ItemList newItems)
{
ScopedLock<Mutex> lock(itemMutex_);
for (ItemList::iterator it = newItems.begin(); it != newItems.end(); ++it)
{
if (... test condition on (*it) ...)
items_.push_back((*it));
}
};
void MyThread::run()
{
_done = false;
do
{
YieldCurrentThread();
if (!isEmpty_)
{
ScopedLock<Mutex> lock(itemMutex_);
for (ItemList::iterator it = items_.begin(); it != items_.end(); ++it)
{
if (... test condition on (*it) ...)
updatedItems_.push_back((*it));
}
}
}
}
的run()函數中,當然,不斷運行,迭代我的items_vector,並使用從另一個線程調用的addItems()函數將項插入到vector中。只有一個線程調用addItems()。
它不可能是困難的,但我沒有看到任何東西在那裏,暗示我還沒有嘗試過的解決方案......
編輯:
- 註釋如下提醒我指出,如果我不調用addItems(),run()函數似乎對應用程序性能沒有任何顯着影響,儘管它可能是浪費的。
它被寫入的方式,它看起來像updatedItems_將不斷地從items_添加相同的項目。 – 2012-03-24 02:35:34
addItems方法未使用items參數。你打算迭代而不是items_? – 2012-03-24 02:42:07
對不起,我修改了代碼以方便閱讀。在addItems()函數中,我犯了拼寫錯誤。他們已被糾正。關於更新的項目,有一個條件測試,它指示自上次檢查文件的時間戳是否發生了變化。如果是這樣,它被推送到更新列表,然後傳回主線程並清除。 – 2012-03-24 02:53:50