• # Lock-free: Encore beaucoup à apprendre.

    Posté par (site web personnel) . En réponse au journal S'essayer à la production scientifique. Évalué à 10.

    Quand tu as des futex_wait ou des pthread_mutex ta structure de donnée n'est pas lock-free
    Lock-free veux dire sans aucun lock.

    Aussi, il y a des erreurs:

    while ( _a c ce ss _en ab led && * ptr < generation ) {
     _waiting = 1;
     // [ici]
     futex_wait (& _waiting , 1);
    }
    _waiting = 0;

    Et

    // Wake other threads waiting for us
    if ( _waiting )
     futex_wake (( void *)& _waiting );

    Ce n'est pas comme ça que les futex fonctionnent, il faut mettre à jour la valeur de _waiting.
    Par exemple, il y a une race condition si le code de réveil est exécuter là ou il y a le ici.
    Lis ce document si ce n'est déjà fait: http://www.akkadia.org/drepper/futex.pdf

    Quand tu fait un ftruncate pour agrandir ton fichier, tu dois refaire unmmap pour que les nouvelles pages
    soit prises en compte. Bonne chance pour faire ça de façon lockfree.

    Je vois aussi que tu utilise le mot clé volatile de temps en temps. Volatile ne doit pas être
    utiliser pour la communication entre threads.

    Enfin tu dis que tu utilise C++03, mais C++03 ne permet pas de faire de la programmation multi-thread.
    En effet: le standard ne mentionne pas les thread et la concurrence.
    Ce n'est que à partir de C++11 qui introduit un modèle de mémoire qui fonctionne avec des thread.
    Et donc tu peux utiliser std::mutex et std::atomique, ça rends le code plus lisible et portable.