Odpovídáte na názor ke článku Chytrý a chytřejší.
Má smysl reagovat? Opravdu je to výstup z MSVC. Jenom jsem si neuvedomil, že pro MT čítání nepoužívám InterlockedIncrement 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():counter(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
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 37 774×
Přečteno 26 420×
Přečteno 24 932×
Přečteno 21 278×
Přečteno 18 932×