Vérifier pour voir si un pthread mutex est verrouillé ou déverrouillé (Après un thread a elle-même bloquée)
J'ai besoin de voir si un mutex est verrouillé ou déverrouillé à une instruction if donc je check comme ça...
if(mutex[id] != 2){
/* do stuff */
}
mais quand je vérifie gcc me donne l'erreur suivante:
error: invalid operands to binary != (have 'ptherad_mutex_t' and 'int')
Alors, comment puis-je vérifier pour voir si le mutex est verrouillé ou pas?
EDIT:
Un élément clé de mon problème est que mon fils (par conception) se verrouiller à droite APRÈS avoir passé le contrôle à un autre thread. Alors, quand Un thread passe le contrôle thread B thread est verrouillé, le thread B agit de certaines choses, puis, quand le fil B est fait de débloquer thread A.
Le problème avec cela est que si le fil B tentatives de déverrouillage fil Un fil et Une n'a pas encore terminé de verrouillage lui-même, puis l'appel à débloquer est perdu de fil et d'Un reste verrouillé ce qui provoque la mort de verrouillage.
Mise à JOUR:
J'ai refait mon programme de prise de la caf de la suggestion, mais je suis toujours en cours d'exécution dans des problèmes. J'ai moulé mon programme dans la structure de la caf prévue le mieux que je peux mais je ne peux même pas dire quelle est la cause de la mort de verrouillage maintenant... j'ai créé une nouvelle question ici demander de l'aide avec mon code.
Ci-dessous est un exécutable de la version de la caf de la suggestion. J'ai fait une petite réorganisation de la fonction pour passer le fil, sans laquelle les deux enfiler un fil et b aurait été verrouillé lors de leur création, en attente d'une condition qui ne pourrait jamais changer.
#include <pthread.h>
int run_a = 0;
pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_a = PTHREAD_COND_INITIALIZER;
int run_b = 0;
pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_b = PTHREAD_COND_INITIALIZER;
void *a(void *);
void *b(void *);
int main(){
int status;
pthread_t thread_a;
pthread_t thread_b;
pthread_create(&thread_a, NULL, a, (void *)0);
pthread_create(&thread_b, NULL, b, (void *)0);
pthread_join(thread_a, (void **)&status);
pthread_join(thread_b, (void **)&status);
}
/* thread A */
void *a(void *i){
while (1) {
printf("thread A is running\n");
sleep(1);
/* unlock thread B */
pthread_mutex_lock(&lock_b);
run_b = 1;
pthread_cond_signal(&cond_b);
pthread_mutex_unlock(&lock_b);
/* wait for thread A to be runnable */
pthread_mutex_lock(&lock_a);
while (!run_a)
pthread_cond_wait(&cond_a, &lock_a);
run_a = 0;
pthread_mutex_unlock(&lock_a);
}
}
/* thread B */
void *b(void *i){
while (1) {
/* wait for thread B to be runnable */
pthread_mutex_lock(&lock_b);
while (!run_b)
pthread_cond_wait(&cond_b, &lock_b);
run_b = 0;
pthread_mutex_unlock(&lock_b);
printf("thread B is running\n");
sleep(1);
/* unlock thread A */
pthread_mutex_lock(&lock_a);
run_a = 1;
pthread_cond_signal(&cond_a);
pthread_mutex_unlock(&lock_a);
}
}
OriginalL'auteur ubiquibacon | 2010-12-06
Vous devez vous connecter pour publier un commentaire.
Mutex ne sont pas le droit primitif pour le projet que vous souhaitez mettre en place. Vous devriez être en utilisant les variables de condition:
Chaque thread va bloquer dans
pthread_cond_wait()
jusqu'à ce que l'autre thread signaux à se réveiller. Ce ne sera pas de blocage.Il peut facilement être étendue à de nombreux threads, par l'allocation d'une
int
,pthread_cond_t
etpthread_mutex_t
par thread.Un tableau de conditions est exactement ce dont vous avez besoin. Il ne sera pas "bloqué à chaque fois qu'il a été consulté par n'importe quel thread". Chaque variable de condition est indépendante: elle n'a pas d'importance si vous les gardez dans un tableau ou dans distinct, nommé globals.
J'ai mis à jour ma question et ajouté mon code, vous pourriez peut-être prendre un coup d'oeil. Je sais que la structure que vous avez proposé est correct, mais je ne peux toujours pas le faire fonctionner à droite (voir mise à jour en question). Le code que j'ai posté est complètement réécrite à partir de quand j'ai demandé à ma question (maintenant à l'aide de l'état).
Je vais jeter un oeil, mais vous pouvez être mieux de poster le nouveau code comme une nouvelle question.
J'ai fait une nouvelle question comme vous l'avez suggéré, merci pour votre aide.
OriginalL'auteur caf
Vous pouvez utiliser
pthread_mutex_trylock
. Si cela réussit, le mutex a été réclamé, et vous êtes maintenant propriétaire d' (de sorte que vous devrait le sortir et de retourner "unheld", dans votre cas). Sinon, quelqu'un est en le tenant.Je tiens à souligner cependant que "vérifier pour voir si un mutex est non réclamés" est une très mauvaise idée. Est soumise à des conditions de course de ce genre de pensée. Si cette fonction vous indique en temps
t
que la serrure est unheld, qui ne dit absolument rien quant à savoir si ou non un autre thread acquis de l'écluse àt+1
.Dans le cas où cela est mieux illustré avec un exemple de code, pensez à:
b
est fait, il déverrouille fila
puis se verrouille. Le système fonctionne très bien, mais en de rares occasions filb
"débloque" threada
avant que le threada
de verrouillage, ainsi que le "débloquer" est perdu et le programme les serrures. J'ai essayé d'utilisertrylock
mais pas de la manière que vous avez suggéré... je vais essayer à nouveau.Il semble que vous devriez considérer un simple programme de synchronisation. Par exemple, vous pourriez avoir B signal d'un sémaphore qui A attend.
le problème est que le thread a contrôle et doit verrouiller lui-même, et je n'ai aucun contrôle sur la façon rapide, il se verrouille automatiquement. B n'signal/déverrouiller le sémaphore pour passer le fil, lorsque le thread B est fait, mais si Un thread n'a pas encore verrouillé lui-même (et donc après que le thread B a signalé pour le déverrouiller) le fil restera verrouillé.
Est-il une raison pour laquelle le fils ne peut pas tout simplement partager un mutex? Thread libère le mutex, les rendements de la CPU, puis attend de nouveau le mutex. Thread B va être réveillé quand Un des communiqués de, prendra le mutex, et puis il n'y a pas de notification avant-attendre problème.
J'ai de nombreux fils et (comme Un[10] et B[10]) qui ne sont pas couplés ensemble, mais sont dépendants les uns des autres. Par exemple, Un thread[1] pourrait dépendre sur le thread B[5] cette boucle, mais la prochaine boucle, il pourrait être dépendants sur le thread B[7] ou à un autre thread.
OriginalL'auteur asveikau
Vous ne pouvez pas comparer un pthread_mutex_t avec un int.
Vous pouvez utiliser
pour vérifier.
OriginalL'auteur Huang F. Lei