4 votes

Fil et fourchettes

Je suis relativement novice en matière de threads et de forks. Pour les comprendre un peu mieux, j'ai donc écrit des programmes simples. Parmi ces petits programmes, j'ai écrit deux programmes, l'un pour imprimer un compteur sur deux processus, et un autre avec deux threads. Ce que j'ai remarqué, c'est que la fourche imprime les compteurs entrelacés alors que le thread imprime le compteur d'un thread puis des autres. Ainsi, le thread n'est pas si parallèle, mais se comporte plus en série Pourquoi ? Est-ce que je fais quelque chose de mal ?

Par ailleurs, que fait exactement pthread_join ? Même lorsque je ne fais pas pthread_join, le programme s'exécute de la même manière.

Voici mon code pour le fil

void * thread1(void *a){
    int i =0;
for(i=0; i<100; i++)
    printf("Thread 1      %d\n",i);
}

void * thread2(void *b){
int i =0;
for(i=0; i<100; i++)
    printf("Thread 2    %d\n", i);
}

int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,thread1, NULL);
pthread_create(&tid2,NULL,thread2, NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}

Et voici mon code pour la fourchette

int main(void)
{
pid_t childPID;
childPID = fork();

if(childPID >= 0) // fork was successful
{
    if(childPID == 0) // child process
    {   int i;
    for(i=0; i<100;i++)
        printf("\n Child Process Counter : %d\n",i);

    }
    else //Parent process
    {
        int i;
        for(i=0; i<100;i++)
            printf("\n Parent Process Counter : %d\n",i);
    }
}
else // fork failed
{
    printf("\n Fork failed, quitting!!!!!!\n");
    return 1;
}

return 0;
}

EDIT : Comment puis-je faire en sorte que le programme threadé se comporte plus comme le programme fork ? c'est-à-dire que les impressions du compteur s'entrecroisent.

1voto

Duck Points 17054

Vous voyagez sur une mauvaise route ici. La leçon que vous devriez tirer est de ne pas essayer de devancer le planificateur du système d'exploitation. Peu importe ce que vous faites - traitement des plannings, priorités, ou tout autre bouton que vous tournez - vous ne pouvez pas le faire de manière fiable.

Vous avez découvert à reculons la nécessité des mécanismes de synchronisation - mutex, sémaphores, variables de condition, barrières de threads, etc. Ce que vous voulez, c'est savoir exactement pourquoi ils existent et ce que vous devez utiliser pour atteindre vos objectifs.

Pour votre dernière question, pthread_join récupère certaines ressources des threads morts et joignables (c'est-à-dire non détachés) et vous permet d'inspecter toute variable de retour du thread expiré. Dans votre programme, ils servent principalement de mécanisme de blocage. C'est-à-dire, main bloquera ces appels jusqu'à ce que les threads expirent. Sans le pthread_joins votre main se terminerait et le processus mourrait, y compris les fils que vous avez créés. Si vous ne voulez pas rejoindre les fils de discussion et que vous ne faites rien d'utile dans le processus de main puis utiliser pthread_exit sur main car cela permettra à main de sortir mais aux threads de continuer le traitement.

0voto

JackCColeman Points 2599

Tout d'abord, un fork crée un second processus tandis que la création d'un thread crée une "unité de travail distribuable" au sein du même processus.

Pour obtenir l'imbrication de deux processus différents, il suffit généralement de laisser le système d'exploitation fonctionner. Cependant, à l'intérieur d'un processus, vous devez en savoir plus sur la façon dont le système d'exploitation choisit lequel de plusieurs threads doit être exécuté.

Vous pourriez probablement, artificiellement, faire en sorte que la sortie des threads soit entrelacée en appelant sleep à des moments différents pour chaque thread. En d'autres termes, créez le thread A (codez-le pour qu'il produise une ligne, puis dormez pendant 100), puis créez le thread B (codez-le pour qu'il produise une ligne, puis dormez pendant 50, etc.)

Je comprends que l'on veuille voir comment les threads peuvent fonctionner en parallèle, comme les processus. Mais, s'agit-il d'une exigence réelle ou simplement d'une demande "zoo" ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X