我一直在困惑于我写的多线程应用程序的问题。简而言之,主线程启动一个热负载线程,该线程接受文件对象的列表(向量),检查其时间戳,并将更改的文件传递给另一个向量。在多线程应用程序中使用向量
当我尝试将新文件添加到需要检查的文件列表时,会发生此问题。热加载线程不断检查其列表中的文件以进行更改,并在迭代时使用范围锁定来锁定/解锁互斥锁。同样,当主线程调用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