C Confus sur la façon d'initialiser et mettre en œuvre un pthread mutex et de la variable de condition
Je suis un peu confus sur la façon d'initialiser et mettre en œuvre un pthread mutex et de la variable de condition. L'objectif du programme est d'avoir des producteurs place un certain nombre d'entiers dans une file d'attente et les consommateurs à prendre les services de renseignements de la file d'attente. Je dois aussi être capable de définir le nombre de producteurs et de consommateurs threads créés. Dans le starter code, je me suis donner à ces:
//Locks & Condition Variables
pthread_mutex_t lock; //Lock shared resources among theads
pthread_cond_t full; //Condition indicating queue is full
pthread_cond_t empty; //Condition indicating queue is empty
que la mise en commun des ressources. Dans le //TODO
commentaire dans la méthode main, l'une des étapes dit pour initialiser le verrouillage et l'état des variables. J'ai une très faible compréhension de pthread mutex et conditions, alors je dis:
lock = PTHREAD_MUTEX_INIT;
full = PTHREAD_MUTEX_INIT;
empty = PTHREAD_MUTEX_INIT;
Dans le consommateur et le producteur, les méthodes, serait je viens d'appeler le verrouiller en disant:
pthread_mutex_lock(&lock);
et
pthread_cond_wait(&full, &lock);
?
Mon code est assez buggé pour l'instant, alors je veux au moins faire en sorte que je suis en utilisant le mutex et les conditions correctement avant de débogage supplémentaires. Merci à l'avance!
- Quelle est ta question exactement?
- Le mutex je suis sûr que vous avez une poignée sur, mais la langue vernaculaire dans les commentaires pour les personnes de condition vars ressemble à un problème. Les variables de Condition, de ne pas "indiquer" quoi que ce soit. Ils sont un mécanisme de signalisation. Ce mécanisme, lorsqu'il est correctement utilisé en conjonction avec un mutex, les signaux des changements dans l'état de externe prédicat de données que vous possédez.
- Oh, et ne pas initialiser la variable de condition avec
PHREAD_MUTEX_INIT
. C'est clairement faux. UtilisationPTHREAD_COND_INITIALIZER
. - Ma question est de savoir si ou non je suis la mise en œuvre de ces correctement. Mon code est buggé et je vais essayer de voir si je au moins correctement initialisé et a appelé ces.
- Et merci WhozCraig, je suis en les utilisant comme un mécanisme de signalisation. Je pense juste que le professeur formulée correctement le commentaire.
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez utiliser le
PTHREAD_XXX_INITIALIZER
macros vous devez les utiliser dans la déclaration de la variable. Également utiliserPTHREAD_COND_INITIALIZER
pour les variables de condition:Ne pas utiliser ces macros pour initialiser le mutex ou la variable de condition plus tard. Si vous avez besoin de le faire plus tard (par exemple si l'objet est alloué dynamiquement), utiliser la fonction init:
Pour vérifier une variable de condition, vous doit utiliser une boucle afin d'éviter les fausses débloque et vous devez verrouiller le mutex lorsque:
pthread_cond_wait()
Donc tout ce qui est en attente d'une est vide condition pourrait ressembler à:
Tout ce qui est à signaler que quelque chose est vide pourrait ressembler à: