POSIX Threads C. pthread_cond_t exemple. Ne fonctionne pas comme prévu

J'ai écrit un écrit un programme qui ne fonctionne pas comme prévu pour.
J'ai deux fils: thread déclenche func et anotherThread déclenche anotherFunc. Ce que je voulais faire, c'est quand cont atteint la valeur 10 dans func, anotherThread être déclenché à l'aide de pthread_cond_wait et pthread_cond_signal. La chose étrange est que tout fonctionne bien si je décommentez la sleep(1) ligne. Je suis nouveau sur les threads et j'ai suivi le tutoriel ici et si je commente la sleep ligne dans leur exemple, il rompt ainsi.

Ma question est comment puis-je faire ce travail sans sleep() appels? Et qu'advient-il si dans mon code à la fois func atteint pthread_mutex_lock après anotherFunc? Comment puis-je contrôler ces choses? C'est mon code:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t myMutex;
pthread_cond_t cond;
pthread_attr_t attr;
int cont;
void *func(void*)
{
printf("func\n");
for(int i = 0; i < 20; i++)
{
pthread_mutex_lock(&myMutex);
cont++;
printf("%d\n", cont);
if(cont == 10)
{
printf("signal:\n");
pthread_cond_signal(&cond);
//           sleep(1);
}
pthread_mutex_unlock(&myMutex);
}
printf("Done func\n");
pthread_exit(NULL);
}
void *anotherFunc(void*)
{
printf("anotherFunc\n");
pthread_mutex_lock(&myMutex);
printf("waiting...\n");
pthread_cond_wait(&cond, &myMutex);
cont += 10;
printf("slot\n");
pthread_mutex_unlock(&myMutex);
printf("mutex unlocked anotherFunc\n");
printf("Done anotherFunc\n");
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t thread;
pthread_t anotherThread;
pthread_attr_init(&attr);
pthread_mutex_init(&myMutex, NULL);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_cond_init(&cond, NULL);
pthread_create(&anotherThread, &attr, anotherFunc, NULL);
pthread_create(&thread, &attr, func, NULL);
pthread_join(thread, NULL);
pthread_join(anotherThread, NULL);
printf("Done MAIN()");
pthread_mutex_destroy(&myMutex);
pthread_cond_destroy(&cond);
pthread_attr_destroy(&attr);
pthread_exit(NULL);
return 0;
}

Désolé pour le long post, mais je suis nouveau sur les threads et je suis disposé à apprendre. Aussi savez-vous quelques bonnes références ou des cours/tutoriels sur les threads et la mise en réseau sur Linux? Je veux apprendre à créer un client de chat et j'ai entendu dire que je sais de threads et de mise en réseau pour que. Le problème est que je ne connais pas assez bon si ce que j'ai appris est ok puisque je ne sais pas ce que je dois savoir.

Merci beaucoup 🙂

  • D'autres remarques. J'ai plus de ne pas avoir à utiliser un pthread_attr_t, vous pouvez utiliser les initialiseurs statiques pour la condition et les mutex pour simplifier le code. En outre, votre fil fonctions peuvent juste return NULL; ou return 0; au lieu de l'appeler pthread_exit. Et votre thread principal peut juste return 0; de main sans appel pthread_exit. Les autres threads ne sont pas en cours d'exécution à ce point, car ils ont été rejoints. de retour de forces principales d'un processus de sortie, mais pthread_exit dans le thread principal ne force pas un processus de sortie, ce qui est utile pour maintenir les autres threads en cours d'exécution.
  • Aussi, il n'est pas nécessaire de nettoyer statique mutex et les conditions. Utilisez simplement pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;. Le complexe initialisations sont nécessaires pour les situations où vous souhaitez définir des caractéristiques inhabituelles. E. g. faire un processus partagé robuste mutex.
InformationsquelleAutor Jacob Krieg | 2012-04-16