Программа упала на старте вот на таком фрагменте кода
void TChartCollectionProxy_::CreateEmptyCollection ()
{
if ( ! ptr_CriticalSection )
{
HORUSBASE_Etl_EnterRestrictedSection
if ( ! ptr_CriticalSection )
Killer.SetCriticalSection ( ( ptr_CriticalSection = new ( mem_CriticalSection ) threadsafe_etl::TCriticalSection_ () ) );
HORUSBASE_Etl_LeaveRestrictedSection
}
if (ptr_CollectionSingleton == 0)
{
threadsafe_etl::TCriticalSectionGuard_ guard ( ptr_CriticalSection );
if (ptr_CollectionSingleton == 0)
ptr_CollectionSingleton = new ( & la_Coll ) TChartCollection_ (); //It's too long for a restricted section.
}
{
threadsafe_etl::TCriticalSectionGuard_ guard ( ptr_CriticalSection );
Attach( ptr_CollectionSingleton );
ptr_CollectionSingleton->IncRef(); // <---------------------- падает здесь
}
}
Быстрый взгляд выявил знакомый паттерн DCLP, который все еще встречается, несмотря на то, что уже давно известно о его проблемах, особенно на многоядерных процессорах.
Вот ссылочка, где проблему со всех сторон разжевывают Саттер с Александреску - http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf.
Мне вот интересно - как теперь выявлять такие места, просматривать все эти сотни мегабайт кода пяти-семилетней давности?
По факту, проблема проявляется очень редко, но это не значит, что ей заниматься не нужно...
Комментариев нет:
Отправить комментарий