Синглетоны, синглетоны...

Nov 17, 2009 14:23

Чтобы чуть-чуть отвлечься от ругани в комментариях про третью часть логов, напишу провокационно-отвлеченное. Опять про мои любимые синглетоны.

static Obj* instance()
{
static Obj obj;
return &obj;
}
_Winnie C++ Colorizer
Взглянем на ассемблерный код:


00401000
00401005
0040100B
0040100D
00401013
00401018
0040101D
00401022
00401027
0040102A
0040102Fmov eax,1
test byte ptr [$S1 (40301Ch)],al
jne main+2Ah (40102Ah)
or dword ptr [$S1 (40301Ch)],eax
mov ecx,offset obj (403018h)
call Obj::Obj (401030h)
push offset `instance'::`2'::`dynamic atexit destructor for 'obj'' (401820h)
call atexit (4010EEh)
esp,4
mov eax,offset obj (403018h)
ret

Или, в переводе на русский:
  1. проверить значение глобальной переменной по адресу 0x40301C
  2. если не 0, то перейти на 0x40102A (возвращаем указатель на объект)
  3. если 0, то: записать туда 1, вызвать конструктор, зарегистрировать деструктор объекта для функции atexit() (!)
  4. вернуть адрес объекта.
Если у вас несколько потоков, то есть шанс попасть на двойную инициализацию конструктора по адресу 0x00401018 - это произойдет в том случае, если два разных треда одновременно пройдут через инструкцию "test byte ptr [$S1 (40301Ch)],al".

Приятной вам отладки.

prog

Previous post Next post
Up