Commit b8821a54 authored by Grégory Mounié's avatar Grégory Mounié

dekker codé en C++11 qui fonctionne (lecture et écriture atomique des variables de synchro)

parents
CXXFLAGS= -std=gnu++11 -Wall -Werror
CC= g++
LDLIBS+= -lpthread
dekker: dekker.o
clean:
rm -f dekker dekker.o
/* Implantation de l'algorithme de dekker en C++ */
/* Vérification du fonctionnement sur l'incrémentation d'une variable
entière non atomique */
#include <atomic>
#include <iostream>
#include <thread>
using namespace std;
volatile int compteur = 0; // le compteur changeant magiquement, il
// faut indiquer au compilateur son
// rechargement
constexpr int NBINC_PER_THREAD= 10000;
atomic_bool demande[2] = {};
atomic_int tour;
void debut_sc(int me, int other) {
debut:
demande[me] = true;
if (demande[other]) {
if (tour == me) {
while(demande[other]);
}
else {
demande[me] = false;
while(tour != me);
goto debut;
}
}
}
void fin_sc(int me, int other) {
tour = other;
demande[me] = false;
}
void incrementeur(int me, int other) {
for(int i=0; i < NBINC_PER_THREAD; i++) {
compteur++;
}
}
void incrementeur_dekker(int me, int other) {
for(int i=0; i < NBINC_PER_THREAD; i++) {
debut_sc(me, other);
compteur++;
fin_sc(me, other);
}
}
int main(int argc, char **argv) {
cout << u8"** Incrémentation sans dekker **" << endl;
thread t1 = thread(incrementeur, 0, 1);
thread t2 = thread(incrementeur, 1, 0);
t1.join();
t2.join();
cout << compteur << "/" << NBINC_PER_THREAD * 2 << endl;
compteur = 0;
cout << u8"** Incrémentation sans dekker **" << endl;
thread t3 = thread(incrementeur_dekker, 0, 1);
thread t4 = thread(incrementeur_dekker, 1, 0);
t3.join();
t4.join();
cout << compteur << "/" << NBINC_PER_THREAD * 2 << endl;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment