Namespaces
Variants

Memory model

From cppreference.net

Définit la sémantique du stockage en mémoire informatique pour les besoins de la machine abstraite C.

Le stockage de données (mémoire) disponible pour un programme C est une ou plusieurs séquences contiguës d' octets . Chaque octet en mémoire possède une adresse unique.

Table des matières

Octet

Un octet est la plus petite unité adressable de mémoire. Il est défini comme une séquence contiguë de bits, suffisamment grande pour contenir n'importe quel membre du jeu de caractères d'exécution de base ( les 96 caractères qui doivent être sur un seul octet). Le C prend en charge des octets de tailles 8 bits et plus.

Les types char , unsigned char , et signed char utilisent un octet à la fois pour le stockage et la représentation de la valeur . Le nombre de bits dans un octet est accessible via CHAR_BIT .

Pour l'utilisation d'octets pour représenter les valeurs d'autres types fondamentaux (y compris les dispositions mémoire big-endian et little-endian), voir object representation

Emplacement mémoire

Un emplacement mémoire est

  • un objet de type scalaire (type arithmétique, type pointeur, type énumération)
  • ou la plus grande séquence contiguë de champs de bits de longueur non nulle
struct S
{
    char a;     // emplacement mémoire #1
    int b : 5;  // emplacement mémoire #2
    int c : 11, // emplacement mémoire #2 (suite)
          : 0,
        d : 8;  // emplacement mémoire #3
    struct
    {
        int ee : 8; // emplacement mémoire #4
    } e;
} obj; // L'objet 'obj' est constitué de 4 emplacements mémoire distincts

Threads et courses aux données

Un thread d'exécution est un flux de contrôle au sein d'un programme qui commence par l'invocation d'une fonction de haut niveau par thrd_create ou d'autres moyens.

Tout thread peut potentiellement accéder à n'importe quel objet du programme (les objets ayant une durée de stockage automatique et thread-local peuvent toujours être accédés par un autre thread via un pointeur).

Il est toujours permis à différents threads d'exécution d'accéder (lire et modifier) différentes emplacements mémoire concurremment, sans interférence et sans exigences de synchronisation. (notez qu'il n'est pas sûr de mettre à jour concurremment deux champs de bits non atomiques dans la même structure si tous les membres déclarés entre eux sont également des champs de bits (de longueur non nulle), quelles que soient les tailles de ces champs de bits intermédiaires)

Lorsqu'une évaluation d'une expression écrit dans un emplacement mémoire et qu'une autre évaluation lit ou modifie le même emplacement mémoire, les expressions sont dites en conflit . Un programme qui a deux évaluations conflictuelles présente une course aux données sauf si

Si une course aux données se produit, le comportement du programme est indéfini.

(en particulier, mtx_unlock est synchronisé-avec , et donc, se produit-avant mtx_lock du même mutex par un autre thread, ce qui permet d'utiliser des verrous de mutex pour se protéger contre les courses aux données)

Ordre mémoire

Lorsqu'un thread lit une valeur depuis un emplacement mémoire, il peut voir la valeur initiale, la valeur écrite dans le même thread, ou la valeur écrite dans un autre thread. Voir memory_order pour plus de détails sur l'ordre dans lequel les écritures effectuées par les threads deviennent visibles pour les autres threads.

(depuis C11)

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 3.6 octet (p: TBD)
  • 3.14 emplacement mémoire (p: TBD)
  • 5.1.2.4 Exécutions multithread et courses aux données (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 3.6 octet (p: TBD)
  • 3.14 emplacement mémoire (p: TBD)
  • 5.1.2.4 Exécutions multi-thread et courses aux données (p: TBD)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 3.6 octet (p: 4)
  • 3.14 emplacement mémoire (p: 5)
  • 5.1.2.4 Exécutions multi-thread et courses aux données (p: 17-21)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 3.6 octet (p: 4)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 1.6 DÉFINITIONS DES TERMES

Voir aussi

Documentation C++ pour Modèle de mémoire