Quels sont exactement les problèmes que l’on peut rencontrer lorsque l’on travaille avec les threads ?
Il n’y en a qu’un seul, massif, dont découle tous les autres : les threads peuvent se marcher sur les pieds en accédant à une ressource partagée, il est très difficile de prévoir tous les cas possibles (tous les ordres conflictuels possibles) qui peuvent se produire sur une bibliothèque donnée dans un contexte multithread, et souvent le "remède" à ces accès partagés (mutexes et autres structures de synchronisation) a lui-même un coût en intelligibilité du code d’une part, et en perfs d’autre part.
Pour cette raison beaucoup de bibliothèques prennent le parti de dire "on ne cherchera pas à résoudre ce problème, débrouillez-vous pour que seul un thread soit responsable de cette donnée/cet état de la bibliothèque".
C’est un parti pris qui peut sembler un peu stupide à première vue, mais qu’on trouve de plus en plus sage chaque fois qu’on se fait couillonner par une race condition.