Programació de C ++: per què potser no necessiteu std :: atomic, però probablement l'haureu d'utilitzar de totes maneres

Bloc

Programació de C ++: per què potser no necessiteu std :: atomic, però probablement l'haureu d'utilitzar de totes maneres

Després d’haver passat anys escrivint aplicacions multi-thread C ++ a Linux, Windows i OS / 2 (vaig escriure el meu primer programa multi-thread a OS / 2 fa 1.0 anys més del que vull admetre), recentment vaig aprendre alguna cosa que em va sorprendre. . Té a veure amb el tipus de protecció de dades necessària quan s’escriu en una adreça de memòria de byte, paraula, doble paraula o quad-paraula (bàsicament, qualsevol valor alineat a la memòria cau de fins a 64 bits) en una aplicació de diversos fils.



Resulta que, si simplement llegiu o escriviu una de les mides de dades esmentades i us trobeu en una CPU AMD o Intel, potser no necessiteu cap mutex, secció crítica, ni tan sols un InterlockedExchange (Windows) o __sync_lock_test_and_set (Linux) en intentar llegir o escriure un valor. Si tot el que necessiteu és llegir o escriure aquest valor atòmic únic de forma segura per a fils, vosaltres maig ser capaç d’escriure-hi directament de forma segura o llegir-ne. Això es deu a que sencer Es garanteix que les lectures i escriptures són atòmiques als processadors AMD i Intel. Feu un cop d'ull a la pàgina 8–2 del Volum 3a Part 1 del Manual per a desenvolupadors de programari Intel 64 i IA-32 (que podeu descarregar des de aquí ):

8.1.1 Operacions atòmiques garantides



El processador Intel486 (i els processadors més nous des de llavors) garanteix

que sempre es faran les següents operacions bàsiques de memòria



es realitzarà atòmicament:

• Llegir o escriure un byte

• Llegir o escriure una paraula alineada en un límit de 16 bits

• Llegir o escriure una paraula doble alineada en un límit de 32 bits

El processador Pentium (i els processadors més nous des de llavors) garanteix que les següents operacions de memòria addicionals sempre es duran a terme atòmicament:

• Llegir o escriure una paraula quadrada alineada en un límit de 64 bits

• Accés de 16 bits a ubicacions de memòria no emmagatzemades que s’adapten a un bus de dades de 32 bits

Els processadors de la família P6 (i els processadors més nous des de llavors) garanteixen que la següent operació de memòria addicional sempre es realitzarà atòmicament:

• Accés sense alinear de 16, 32 i 64 bits a la memòria cau que s'adapta a una línia de memòria cau

Ara, abans de trucar-me a la Inquisició, heu d’entendre que tampoc no m’ho creia. Així que vaig aprofitar per escriu la meva pròpia prova .

El meu escenari de proves és bàsicament el següent: generar un nombre igual de fils que tots intenten llegir o escriure simultàniament en una ubicació de memòria única, milions de vegades. Com a control, he escollit un grapat de números màgics que els fils de l'escriptor escriuran a l'atzar a la mateixa variable de 64 bits.

#multithreading # programació cpp

medium.com

Programació de C ++: per què potser no necessiteu std :: atomic, però probablement l'haureu d'utilitzar de totes maneres

Després d’haver passat anys escrivint aplicacions multi-thread C ++ a Linux, Windows i OS / 2 (vaig escriure el meu primer programa multi-thread a OS / 2 fa 1.0 anys més del que vull admetre), recentment vaig aprendre alguna cosa que em va sorprendre. . Té a veure amb el tipus de protecció de dades necessària quan s’escriu en una adreça de memòria de byte, paraula, doble paraula o quad-paraula (bàsicament, qualsevol valor alineat a la memòria cau de fins a 64 bits) en una aplicació de diversos fils.