2009-09-11 11 views
1

J'écris une bibliothèque réseau à laquelle un utilisateur peut passer un pointeur de fonction pour l'exécuter sur certains événements réseau. Afin de garder la boucle d'écoute de retarder l'application du développeur, je passe le gestionnaire d'événements à un thread. Malheureusement, cela crée un peu de mal de tête pour gérer les choses d'une manière sûre pour les threads. Par exemple, si le développeur passe une fonction qui appelle les éléments de l'application Windows :: Forms, une exception InvalidOperationException sera lancée.Pointeurs de fonctions thread-safe en C++

Existe-t-il de bonnes stratégies pour gérer la sécurité des threads?

+0

Le développeur ne devrait-il pas être responsable de s'assurer qu'il ne change pas de composant tant qu'il n'est pas sur le fil de l'événement? –

+0

Que voulez-vous dire par "sécurité des threads" dans la question - vous voulez spécifiquement un moyen de laisser une fonction de rappel modifier les éléments de formulaires de l'autre thread? "Comment écrire du code multi-thread?" L'OMI n'est pas vraiment assez spécifique pour répondre. –

Répondre

2

Les pointeurs de fonction ne peuvent pas être thread-safe car ils déclarent un point à appeler. Donc, ils ne sont que des pointeurs. Votre code s'exécute toujours dans le thread à partir duquel il a été appelé (via le pointeur de fonction).

Ce que vous voulez réaliser, c'est que votre code s'exécute dans un thread spécifique (peut-être le thread de l'interface utilisateur). Pour cela, vous devez utiliser une sorte de file d'attente pour synchroniser l'invocation dans MainThread.

C'est exactement ce que font BeginInvoke()/Invoke() sur un formulaire. La file d'attente est dans ce cas (quelque part au fond du framework .NET) la file d'attente des messages Windows. Mais vous pouvez utiliser n'importe quelle autre file d'attente tant que le thread "correct" lit et exécute les demandes d'appel à partir de cette file d'attente.

+0

Je ne suis pas sûr si nous ne sommes pas d'accord ou pas. "Votre code s'exécute toujours dans le thread que le pointeur de fonction a utilisé pour l'appeler." Je ne sais pas ce que cela signifie. si vous vouliez dire: "Votre code s'exécute toujours dans le thread le pointeur de fonction utilisé pour l'appeler." alors c'est correct. Sinon, il semblerait que vous vouliez dire que la fonction que le pointeur référence n'aura pas de contexte unique lorsqu'il est appelé, et c'est incorrect. –

+0

J'ai édité la réponse alors maintenant, nous l'espérons, c'est clair. – mmmmmmmm