Re[2]: vc6 private destructors bug?
От: Andrew S Россия http://alchemy-lab.com
Дата: 06.02.04 12:14
Оценка:
AS>>
AS>>struct MeyersSingleton
AS>>{
AS>>    static MeyersSingleton &Instance()
AS>>    {
AS>>        static MeyersSingleton obj;
AS>>        return obj;
AS>>    }
maq>// skipped
AS>>


maq>Оффтопик:


maq>В книге "Применение шаблонов проектирования" Влиссидес утверждает что

maq>синглетон Мейерса потоконебезопасен, так как некоторые компиляторы генерируют
maq>небезопсный код для метода Instance, который не получится защитить.

maq>Знать бы что за компиляторы еще такие...


Да, я тоже про это думал. Похоже, VC6 не беспокоится об этом:

    mov    al, BYTE PTR ?$S223@?1??Instance@?$CMeyersSingleton@VCNetworkSession@@@@SAAAVCNetworkSession@@XZ@4EA ; ?$S223@?1??Instance@?$CMeyersSingleton@VCNetworkSession@@@@SAAAVCNetworkSession@@XZ@4EA
    mov    BYTE PTR __$EHRec$[esp+80], 4
    test    al, 1
    jne    SHORT $L90959
    or    al, 1
    push    10                    ; 0000000aH
    mov    ecx, OFFSET FLAT:?obj@?1??Instance@?$CMeyersSingleton@VCNetworkSession@@@@SAAAVCNetworkSession@@XZ@4U2@A
    mov    BYTE PTR ?$S223@?1??Instance@?$CMeyersSingleton@VCNetworkSession@@@@SAAAVCNetworkSession@@XZ@4EA, al ; ?$S223@?1??Instance@?$CMeyersSingleton@VCNetworkSession@@@@SAAAVCNetworkSession@@XZ@4EA
    push    OFFSET FLAT:?obj@?1??Instance@?$CMeyersSingleton@VCNetworkSession@@@@SAAAVCNetworkSession@@XZ@$AU1@A ; obj
    call    _atexit
    add    esp, 4
$L90959:


Из этого кода очевидно, что VC6 забыл про потокобезопасность, хотя ему явно указано /MT.
Тогда какие варианты кроме создания синглтона на хипе и регистрации уничтожения при помощи _atexit?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.