En passant le pointeur this
à fils est pas, en soi, mauvais. Ce que vous faites avec ça peut l'être.
Le pointeur this
est comme n'importe quel autre type de données POD-ish. C'est juste un morceau de bits. Les choses qui sont dans this
pourraient être plus que PODs cependant, et passer ce qui est en fait un pointeur à ses membres peut être dangereux pour toutes les raisons habituelles. Chaque fois que vous partagez quelque chose à travers les threads, cela introduit des conditions de course potentielles et des blocages. Le moyen élémentaire pour résoudre ces conflits est, bien sûr, d'introduire la synchronisation sous la forme de mutex, de sémaphores, etc., mais cela peut avoir l'effet surprenant de sérialiser votre application. Dites que vous avez un thread lire des données à partir d'un socket et le stocker dans un tampon de commande synchronisé, et un autre thread qui lit à partir de ce tampon de commande. Les deux threads utilisent le même mutex, qui protège le tampon. Tout va bien, non?
Eh bien, peut-être pas. Vos threads peuvent être sérialisés si vous ne faites pas très attention à la manière dont vous verrouillez le tampon. Vous avez probablement créé des threads distincts pour les codes buffer-insert et buffer-remove afin qu'ils puissent fonctionner en parallèle. Mais si vous verrouillez le tampon avec chaque insertion & chaque suppression, alors une seule de ces opérations peut être exécutée à la fois. Tant que vous écrivez dans le tampon, vous ne pouvez pas en lire et vice versa.
Vous pouvez essayer d'affiner les verrous afin qu'ils soient aussi courts que possible, mais tant que vous avez partagé des données synchronisées, vous aurez un certain degré de sérialisation.
Une autre approche consiste à transférer explicitement les données à un autre thread et à supprimer autant de partage de données que possible. Au lieu d'écrire et de lire à partir d'un tampon comme ci-dessus, par exemple, votre code de socket peut créer une sorte d'objet Command
sur le tas (par exemple Command* cmd = new Command(...);
) et le transmettre à l'autre thread. (Une façon de le faire dans Windows est via le mécanisme QueueUserAPC).
Il y a des avantages & des inconvénients aux deux approches.La méthode de synchronisation a l'avantage d'être plus simple à comprendre et à mettre en œuvre à la surface, mais l'inconvénient potentiel d'être beaucoup plus difficile à déboguer si vous gâchez quelque chose. La méthode de transfert peut rendre impossible la plupart des problèmes inhérents à la synchronisation (rendant ainsi plus simple), mais il faut du temps pour allouer de la mémoire sur le tas.
Pouvez-vous un peu de code? Connaissez-vous la distinction entre classes et instances? Y a-t-il une instance de classe de maître pour chaque thread? –
Non, il existe une seule classe principale à partir de laquelle les threads sont générés. Les threads ont juste besoin d'accéder aux fonctions des membres maîtres et à certaines variables. –