Odpověď na názor

Odpovídáte na názor ke článku Chytrý a chytřejší.

  • 11. 11. 2011 17:11

    Ondřej Novák (neregistrovaný)

    Má smysl reagovat? Opravdu je to výstup z MSVC. Jenom jsem si neuvedomil, že pro MT čítání nepoužívám InterlockedIn­crement ale InterlockedXAdd (+1). Proto ta jednička v tom volání. Nevíte jak kód pokračuje, třeba překladač pak tu jedničku rovnou někde používá. Opravdu dávno nepíšu v ASM. Jestli chcete vidět, jak vypadá zdroják tak asi takto:

    class RefCntObj {
    static const natural fastFlag = (~natural(0)) << (sizeof(natural) * 8 - 1);
    public:

    RefCntObj():cou­nter(fastFlag) {}

    void addRef() const {
    if ((counter & fastFlag)) ++counter;
    else addRefMT();
    }

    bool release() const {
    if ((counter & fastFlag) != 0) {
    return --counter > 1;}

    protected:
    mutable natural counter;

    void addRefMT() const;
    bool releaseMT() const;
    };

    Datový typ natural je size_t (závisí na platformě).

    Výstup je z MSVC 2008

    K vašemu bodu 1). Pokud programátor ví, že většina objektů není MT safe, což opravdu není, v mých knihovnách nic není MT Safe, musí se postarat, aby všechny objekty byly v nějakém zámku, nebo se vůbec mezi vlákny nesdílely. RefCntObj má možnost zapnout sdílení pointerů bez nutnost zamykaní. Pokud to jednou zapnu, to tehdy, kdy dávám pointer do jiného vlákna, pak už se o to nemusím starat