내 프로젝트 중 하나에서 중요한 병목으로 std::deque<T>::clear()
에 대한 호출을 확인했습니다.전용 스레드에서 STL 지우기
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
은 지워진 후 몇 초 동안 해당 스레드가 액세스하지 않을 것입니다.
디버거를 연결하지 않고 실행해도 속도가 느립니까? –
STL 컨테이너 자체는 스레드로부터 안전하지 않으므로 다중 스레드 환경에서 컨테이너 작업을 수행하기 전에 코드에서이를 전제로 사용해야합니다. – DumbCoder
예. 실제로 사용하고있는 deque에는 int가 아닌 수백만 개의 객체가 포함되어 있습니다. –