Partager via


C28648

avertissement C28648 : PulseEvent est une fonction peu fiable

Un thread en attente sur un objet de synchronisation peut être momentanément supprimé de l’état d’attente par un APC en mode noyau, puis retourné à l’état d’attente une fois l’APC terminé. Si l’appel à PulseEvent se produit pendant la période où le thread a été supprimé de l’état d’attente, le thread n’est pas libéré et se bloque pour toujours. Cela est dû au fait que PulseEvent libère uniquement les threads qui attendent au moment où il est appelé.

Voici quelques-unes des façons de résoudre l’utilisation de PulseEvent :

  • Si un seul des threads en attente de l’événement doit être libéré ET que l’événement est un événement de réinitialisation manuelle, remplacez-le par un événement de réinitialisation automatique et appelez SetEvent au lieu de PulseEvent.

  • Si un seul des threads en attente de l’événement doit être libéré ET que l’événement est un événement de réinitialisation automatique, appelez SetEvent au lieu de PulseEvent.

  • Si tous les threads en attente de l’événement doivent être libérés ET que l’événement est un événement de réinitialisation manuelle, réinitialisez votre code pour utiliser un autre type d’objet de synchronisation (tel qu’un sémaphore).

  • Si tous les threads en attente de l’événement doivent être libérés ET que l’événement est un événement de réinitialisation automatique, appelez SetEvent au lieu de PulseEvent (votre appel d’origine à PulseEvent ne publiait de toute façon qu’un seul thread).