В одном из моих проектов я назвал std::deque<T>::clear()
серьезным узким местом.
Поэтому я решил переместить эту операцию в отдельный поток с низким приоритетом:
template <class T>
void SomeClass::parallelClear(T& c)
{
if (!c.empty())
{
T* temp = new T;
c.swap(*temp); // swap contents (fast)
// deallocate on separate thread
boost::thread deleteThread([=] () { delete temp; } );
// Windows specific: lower priority class
SetPriorityClass(deleteThread.native_handle(), BELOW_NORMAL_PRIORITY_CLASS);
}
}
void SomeClass:clear(std::deque<ComplexObject>& hugeDeque)
{
parallelClear(hugeDeque);
}
Кажется, это работает нормально (VisualC ++ 2010), но мне интересно, пропустил ли я какой-либо серьезный недостаток. Буду рад вашим комментариям по поводу приведенного выше кода.
Дополнительная информация :
SomeClass:clear()
вызывается из потока GUI, и пользовательский интерфейс не отвечает до возврата вызова. С другой стороны, hugeQueue
вряд ли будет доступен этому потоку в течение нескольких секунд после очистки.