Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Mot clé thread_local

Syntaxe d'utilisation

thread_local type variableName;

Ce mot clé permet d'indiquer qu'une variable stockera une valeur différentes pour chaque thread qui l'utilisera. Il se place devant la déclaration de votre variable.

Exemple de code

#include <iostream>
#include <thread>

using namespace std;

#define THREAD_COUNT 10
#define LOOP_COUNT 10000

thread_local unsigned long counter = 0;

void entryPoint() {
    for( unsigned long i=0; i<LOOP_COUNT; i++ ) {
        counter ++;
    }

    cout << "thread terminated " << counter << endl;
}

int main() {
    array<thread, THREAD_COUNT> threads;
    for( unsigned int i = 0; i < THREAD_COUNT; ++i ) {
        threads[i] = thread( entryPoint );
    }
    for( thread & th : threads ) th.join();

    cout << "Counter == " << counter << endl;

    return 0;
}

Pour compiler et exécuter cet exemple, veuillez saisir les lignes de commandes suivantes (attention, l'affichage final pour légèrement varier de l'exemple ci-dessous, à cause de l'aspect "multi-threadé" de notre exemple). Notez que, dans cet exemple, il n'est pas nécessaire de synchroniser les incrémentations à cause du mot clé thread_local : il y aura bien une valeur de counter pour chaque thread.

$> g++ -Wall -std=c++11 Sample.cpp -o Sample -pthread
$> Sample
thread terminated thread terminated 10000
10000
thread terminated 10000
thread terminated 10000
thread terminated thread terminated 1000010000

thread terminated 10000
thread terminated 10000
thread terminated 10000
thread terminated 10000
Counter == 0
$>

Attention : cet exemple met bien en jeu 11 threads : les dix explicitement lancés et le thread principal exécutant votre main.