picodev pensait peut-être plus à diviser la tâche du worker thread en section indépendantes exécutables en parallèle. Si tu fais des opérations sur les éléments d'un tableau de taille
T, par exemple, et qu'elles sont réalisables indépendamment les unes des autres, alors tu peux scinder le tableau en
n parties et faire traiter à chaque thread numéro
i les éléments dans l'intervalle
[i * T / n, (i + 1) * T / n[. Sur une machine avec au moins autant de coeurs ou processeurs que de threads instanciés, le programme est
en théorie n fois plus rapide.
Par contre j'entends parler de parallélisme et de copie, on cause bien de copie en mémoire ? Non parce que paralléliser l'entrée-sortie c'est
le truc à éviter, sauf application spécifique il n'y a au final qu'un disque, sortie standard, socket, etc...
Pour ton besoin, dans un cadre purement applicatif, honnêtement je pense que le multithreading est
overkill. Appelle
printf tous les
n tours de boucle et tu obtiendras un programme simple, concis et fiable qui fait efficacement ce qu'on lui demande.
Dans un cadre pédagogique en revanche, l'exercice est intéressant donc on continue.
Non tu te poses les bonnes questions.
Imagine deux personnes en train de faire la vaisselle : l'une lave les assiettes puis les pose sur l'égouttoir et l'autre les prend puis les essuie. Chacun est à sa tâche,
à son rythme, et
ne se mêle pas du travail de l'autre, celui qui essuie ne dit pas à son camarade comment laver et vice-versa... jusqu'à ce qu'ils doivent se coordonner pour accéder à l'égouttoir ! L'égouttoir est une
ressource partagée, dont les accès sont
mutuellement exclusifs (tu vois où je veux en venir ?
).
Il faut que tu définisses clairement les tâches de chacun, que tu identifies ton égouttoir, et que tu en synchronises les accès. Commence avec un mutex, c'est le plus simple (il y a des problèmes inhérents à cette implémentation que je n'évoquerai pas, mais les threads POSIX sont franchement bien foutus et en pratique avec deux threads ça devrait passer crème) : demande le verrou associé à ta ressource partagée lorsque tu y accèdes en lecture et/ou écriture (ton thread bloquera tant qu'il n'est pas disponible), réalise tes opérations pui relâche le verrou. Tu auras besoin de toute la famille
pthread_mutex_*. N'oublie pas de relâcher et détruire ton mutex lorsque tu n'en as plus l'usage.
Le multithreading, c'est franchement difficile. Accroche-toi.
Partager