Leichte Spinlocks aus GCC-Atomoperationen?

Ich möchte die Synchronisation minimieren und, wenn möglich, in einem meiner Projekte sperrenfreien Code schreiben. Wenn es absolut notwendig ist, würde ich gerne leichte Spinlocks, die aus atomaren Operationen aufgebaut sind, anstelle von pthread- und win32-Mutex-Locks einsetzen. Meines Wissens nach handelt es sich hierbei um Systemaufrufe, die einen Kontextwechsel verursachen können (was für sehr schnelle kritische Abschnitte, in denen ein paar Maliges Drehen vorzuziehen wäre, möglicherweise unnötig ist).

Die Atomoperationen, auf die ich mich beziehe, sind hier gut dokumentiert:http: //gcc.gnu.org/onlinedocs/gcc-4.4.1/gcc/Atomic-Builtins.htm

Hier ist ein Beispiel, um zu veranschaulichen, wovon ich spreche. Stellen Sie sich einen RB-Baum mit mehreren Lesern und Schreibern vor. RBTree :: exists () ist schreibgeschützt und threadsicher. RBTree :: insert () erfordert den exklusiven Zugriff eines einzelnen Autors (und keiner Leser), um sicher zu sein. Ein Code:

class IntSetTest
{
private:
    unsigned short lock;
    RBTree<int>* myset;

public:
    // ...

    void add_number(int n)
    {
        // Aquire once locked==false (atomic)
        while (__sync_bool_compare_and_swap(&lock, 0, 0xffff) == false);

        // Perform a thread-unsafe operation on the set
        myset->insert(n);

        // Unlock (atomic)
        __sync_bool_compare_and_swap(&lock, 0xffff, 0);
    }

    bool check_number(int n)
    {
        // Increment once the lock is below 0xffff
        u16 savedlock = lock;
        while (savedlock == 0xffff || __sync_bool_compare_and_swap(&lock, savedlock, savedlock+1) == false)
            savedlock = lock;

        // Perform read-only operation    
        bool exists = tree->exists(n);

        // Decrement
        savedlock = lock;
        while (__sync_bool_compare_and_swap(&lock, savedlock, savedlock-1) == false)
            savedlock = lock;

        return exists;
    }
};

(Nehmen wir an, es muss nicht ausnahmesicher sein)

Ist dieser Code tatsächlich threadsicher? Gibt es irgendwelche Vor- / Nachteile für diese Idee? Irgendein Rat? Ist die Verwendung solcher Spinlocks eine schlechte Idee, wenn die Threads nicht wirklich gleichzeitig ablaufen?

Danke im Voraus. ;)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage