J'ai un problème avec les mutex (pthread_mutex sous Linux) où si un thread verrouille à nouveau un mutex après l'avoir déverrouillé, un autre thread ne réussit pas à obtenir un verrou. J'ai attaché le code de test où un mutex est créé, avec deux threads qui dans une boucle sans fin verrouillent le mutex, dorment pendant un moment et le déverrouillent encore. La sortie que je m'attends à voir est des messages "vivants" des deux threads, un de chaque (par exemple 121212121212. Cependant, ce que je reçois est que les threads obtient la majorité des verrous (par exemple 111111222222222111111111 ou simplement 1111111111111 ...).Verrouillage permanent du mutex entraînant un blocage?
Si j'ajoute un usleep (1) après le déverrouillage, tout fonctionne comme prévu.Il semble que lorsque le thread passe à SLEEP l'autre thread obtient son verrou - mais ce n'est pas la façon dont je l'attendais, comme l'autre thread J'ai déjà appelé pthread_mutex_lock, je suppose que c'est la façon dont cela est implémenté, en ce sens que le thread actice a la priorité, mais il crée un problème dans ce cas particulier (y a-t-il un moyen de l'empêcher? une sorte de signalisation) ou où est mon erreur en compréhension?
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <unistd.h>
pthread_mutex_t mutex;
void* threadFunction(void *id) {
int count=0;
while(true) {
pthread_mutex_lock(&mutex);
usleep(50*1000);
pthread_mutex_unlock(&mutex);
// usleep(1);
++count;
if (count % 10 == 0) {
printf("Thread %d alive\n", *(int*)id);
count = 0;
}
}
return 0;
}
int main() {
// create one mutex
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutex_init(&mutex, &attr);
// create two threads
pthread_t thread1;
pthread_t thread2;
pthread_attr_t attributes;
pthread_attr_init(&attributes);
int id1 = 1, id2 = 2;
pthread_create(&thread1, &attributes, &threadFunction, &id1);
pthread_create(&thread2, &attributes, &threadFunction, &id2);
pthread_attr_destroy(&attributes);
sleep(1000);
return 0;
}
J'espérais que l'appel de verrouillage de l'autre thread aurait été enregistré et que le verrou du thread en cours d'exécution n'aboutisse pas (c'est-à-dire les mutex en file d'attente). Comme il s'agit d'un cas de test artificiel et qu'il ne se passe pas réellement dans mon application, je m'en tiendrai à cela, mais gardez votre réponse à l'esprit si ce problème venait à se reproduire. – Daniel