Bonjour à tous et à toutes :)
J'ai une variable qui est partagée entre plusieurs threads :
std::list<DataUser> m_clients[32][18];
Bon vous savez les problèmes que ça apporte si l'un est en lecture et qu'en même temps, un autre thread supprime une entrée de la list.
J'ai donc trouvé les deque qui, dans ce cas, font pointer l'itérateur qui pointe sur rien (à cause d'une suppression) sur la donnée précédente dans la liste.
Voilà, seulement, comment être alerté que l'itérateur a changé ainsi dans une boucle ? Est-ce que on peut simplement stocker l'itérateur précédent et le comparer à l'itérateur actuel ? Ainsi, si les deux itérateurs sont équivalent, ça veut dire qu'il y a eu une suppression et du coup, faut pas exécuter le code qui va suivre...
Merci de votre patience et bonne journée ! 8)
D'accord et est-ce que la SFML intègre des mutex qui permettent de faire un model multiple-reader/single writer ?
Voici un code avec les mutex normal pour ce genre de problème, mais ça semble vraiment bordélique...
thread_lecture1
{
mutex_écriture.lock(); //Si on écrit, alors on attend
mutex_écriture.unlock(); //Écriture fini, on peut lire
mutex_lecture1.lock(); //Lecture1 en cours... on lock le mutex
//Plein de code...
mutex_lecture1.unlock(); //Lecture terminée, on débloque le mutex de lecture1
}
thread_lecture2
{
mutex_écriture.lock(); //Si on écrit, alors on attend
mutex_écriture.unlock(); //Écriture fini, on peut lire
mutex_lecture2.lock(); //Lecture2 en cours... on lock le mutex
//Plein de code...
mutex_lecture2.unlock(); //Lecture terminée, on débloque le mutex de lecture1
}
thread_écriture
{
mutex_écriture.lock(); //On veut écrire, on lock le mutex d'écriture
mutex_lecture1.lock(); //On s'assure que lecture1 n'est pas en cours
mutex_lecture1.unlock(); //On le débloque, car le but n'est pas de le bloquer
mutex_lecture2.lock(); //On s'assure que lecture2 n'est pas en cours
mutex_lecture2.unlock(); //On le débloque, car le but n'est pas de le bloquer
//Plein de code...
mutex_écriture.unlock(); //Écriture terminée, on débloque le mutex de d'écriture
}
Sans compter qu'il va falloir mettre tout ça à jour si un jour j'ajoute un nouveau lecteur...
Quelle serait la meilleure solution sans sortir du cadre de la SFML ? On m'a présenté par exemple boost::shared_mutex, mais je ne suis vraiment pas intéressé à utiliser une autre bibliothèque que la SFML dans ce projet.
Merci et bonne journée ;)