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 997×
Přečteno 26 602×
Přečteno 25 303×
Přečteno 21 419×
Přečteno 19 279×