72 votes

Pourquoi Interlocked.Exchange ne prend pas en charge le type booléen?

Existe-t-il une raison pratique pour laquelle l’équipe .NET a décidé de ne pas prendre en charge Boolean dans le fonctionnement Interlocked.Exchange?

L'un des exemples d'utilisation concerne le fait de garantir qu'un code n'est exécuté qu'une seule fois et que vous souhaitez utiliser un indicateur booléen pour cela.

69voto

Hans Passant Points 475940

Oui, il y a une bonne raison. La mise en œuvre de la Contrefil méthodes nécessite un faible niveau de soutien au niveau du processeur. Voir cette réponse par exemple. C'est un problème lors de la définition d'un cadre d'architecture de l'agnostique.

La mise en œuvre de la basse-lock techniques pris en charge par la classe Interlocked sur les types de données qui sont une fraction de la patrie, de processeur, la taille de mot est difficile. L'approche RISC cpu conception qui a été populaire+ de 10 ans déconseillé fortement. L'inadéquation entre l'opérande de la taille et de la largeur du bus mémoire natif rend très difficile à mettre en œuvre. L'une des raisons que l'architecture x86 d'Intel est encore sur vos genoux, survivant de 30 ans déjà par ne pas prendre les raccourcis. Plus d'informations de fond sur RISC dans cet article de wikipédia.

20voto

ILIA BROUDNO Points 16

Ne pas répondre à la question, mais comme solution de contournement, vous pouvez simplement utiliser int au lieu de booler comme C le fait.

     int m_IsFirstTime = 1; // 1 means true 0 means false. 

    void SomeMethod()
    {
        if (1 == Interlocked.Exchange(ref m_IsFirstTime , 0))
            // Do something for the first time.

        else
            // Do something for all other times.

    }
 

Post-scriptum S'il existe des preuves que la lecture est plus rapide que l'écriture alors Interlocked.CompareExchange peut être mieux pour ce cas (une seule première fois et je suppose beaucoup de non d'abord).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X