c++ bonne utilisation de mutex

j'ai multithread projet et j'ai couru à travers valgrind --tool=helgrind et il m'a montré quelques erreurs. Je suis l'aide de mutex il exaxtly comment je l'ai trouvé sur le net comment l'utiliser, pouvez vous s'il vous plaît me montrer quoi de mal?

#include <iostream>
#include <pthread.h>

#define MAX_THREADS     100
#define MAX_SESSIONS    100

static pthread_mutex_t  M_CREATE_SESSION_LOCK= PTHREAD_MUTEX_INITIALIZER;


.....



void connection::proccess(threadVarsType &THREAD) {
    ....

    pthread_mutex_lock(&M_CREATE_SESSION_LOCK);

    unsigned int ii;
    for (ii=0; ii<MAX_SESSIONS; ii++) {
        if (SESSION[ii]==NULL) {
            break;
        }
    }
    if (ii==MAX_SESSIONS-1) {
        ....
        pthread_mutex_unlock(&M_CREATE_SESSION_LOCK);                       //unlock session mutex
        ....
        return;
    } else {
        ....
        pthread_mutex_unlock(&M_CREATE_SESSION_LOCK);                       //unlock session mutex
        ....
    }

    ....
}

et les messages d'erreur:

==4985== Thread #1's call to pthread_mutex_lock failed
==4985==    with error code 22 (EINVAL: Invalid argument)
    ....
==4985== Thread #1 unlocked an invalid lock at 0x4E7B40
==4985==    at 0x32CD8: pthread_mutex_unlock (hg_intercepts.c:610)
    ....
==4985== Thread #1's call to pthread_mutex_unlock failed
==4985==    with error code 22 (EINVAL: Invalid argument)
    ....
==4985== Thread #1's call to pthread_mutex_lock failed
==4985==    with error code 22 (EINVAL: Invalid argument)
    ....
==4985== Thread #1 unlocked an invalid lock at 0x4E7B40
==4985==    at 0x32CD8: pthread_mutex_unlock (hg_intercepts.c:610)
    ....
==4985== Thread #1's call to pthread_mutex_unlock failed
==4985==    with error code 22 (EINVAL: Invalid argument)
Envisager d'utiliser Boost.Thread (boost.org/doc/libs/release/doc/html/thread.html) qui utilise les pthreads sous le capot. C'est tellement plus facile à travailler que le raw pthreads API.
je suis à la recherche de la solution la plus simple, parce que si je vais ajouter des millions bibliothèques ensuite, le programme sera 1000x plus lent et 100 de plus - et je n'apprendront rien 🙁
pthread est une interface C. Il n'a pas d'exceptions; ainsi, vous vérifiez les codes d'erreur lors de l'appel de ces fonctions.
Utilisation De Boost.Thread ne fera pas de votre programme de tellement plus grand, si vous avez un lien pour la version statique de la bibliothèque. Il ne sera également pas être considérablement plus lent. Pourquoi avez-vous de soins si votre programme se termine un peu ko plus grande? Le logiciel n'est plus distribué sur les disquettes de 1,44 MO, vous savez. Je suis désolé, mais vous avez peu de sérieux malentendus à propos de l'utilisation de bibliothèques telles un coup de pouce.
Si vous souhaitez utiliser le raw pthreads API à des fins d'apprentissage, je peux comprendre. Mais l'apprentissage pthreads ne va pas vous apprendre les notions fondamentales et les pièges de la programmation multithread. Ces concepts fondamentaux s'appliquent à de nombreux langages de programmation, quelle que soit la bibliothèque/interface utilisée pour le multithreading. Tout comme la façon dont l'apprentissage de l'assemblée de la langue ne va pas vous apprendre sur les structures de données et algorithmes.

OriginalL'auteur | 2011-04-29