Environnement: .NET 3.5 SP1..NET: Comment s'assurer que Thread 1 peut voir ce que Thread 2 a écrit dans un champ?
J'ai deux threads: un thread d'interface utilisateur et un thread de travail d'arrière-plan. Le thread de travail d'arrière-plan met périodiquement à jour certains champs dans un objet partagé et le thread d'interface utilisateur les vérifie. Rien de spectaculaire - juste la progression, les valeurs de retour et les exceptions levées. Le thread de travail soulève également certains événements sur le thread d'interface utilisateur (via Control.BeginInvoke
) lorsqu'il modifie ces champs.
Le thread de travail écrit WRITES ces champs, et le thread UI les lisent SEULEMENT. Ils ne sont pas utilisés pour d'autres communications. Par souci de performance, je voudrais éviter le verrouillage sur l'objet partagé ou les propriétés individuelles. Il n'y aura jamais d'état non valide dans l'objet partagé.
Cependant, je suis préoccupé par des choses comme les caches de processeurs et les optimisations de compilateurs. Comment puis-je éviter la situation lorsqu'une valeur mise à jour n'est pas visible dans le gestionnaire d'événements sur le thread d'interface utilisateur? Est-ce que l'ajout de volatile
à tous les champs sera suffisant?
Évitez d'utiliser des objets partagés. C'est une mauvaise pratique en général. Utilisez simplement des événements ou des messages pour communiquer entre les threads. – Peladao
Pouvez-vous donner un exemple de la façon dont un cache de processeur ou une optimisation de compilateur peut provoquer l'échec de votre programme? Je ne comprends pas ce que vous voulez dire. –
Cookies @Rice Flour - Eh bien, si le thread de travail a terminé la tâche et a écrit quelque chose dans le champ "Résultat", mais le thread UI voit encore là pour les 5 prochaines heures, il ne serait pas très productif ... –