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

ajout du code de peterson

parent 284a81b3
CXXFLAGS= -std=gnu++11 -Wall -Werror -O2
CXXFLAGS= -std=gnu++11 -Wall -Werror -O3
CC= g++
LDLIBS+= -lpthread
all: dekker peterson
dekker: dekker.o
peterson: peterson.o
clean:
rm -f dekker dekker.o
rm -f dekker dekker.o peterson peterson.o
/* Implantation de Dekker en C++ */
/* Verification du fonctionnement
sur l'incrementation d'une variable
entière non atomique (mais volatile) */
#include <atomic>
#include <iostream>
#include <thread>
using namespace std;
// le compteur changeant magiquement,
// il faut indiquer au compilateur
// son necessaire rechargement
volatile int compteur = 0;
constexpr int NBINC= 10000;
/* Juste avec volatile */
/* marche pas ! */
void incrementeur(int me, int other) {
for(int i=0; i < NBINC; i++) {
compteur++;
}
}
/* Peterson */
/* sans operations atomiques de synchro */
/* juste volatile pour les variables */
/* marche pas non plus ! */
volatile bool fdemande[2] = {};
volatile int fdernier;
void fdebut_sc(int me, int other) {
fdemande[me] = true;
fdernier = me;
while (fdemande[other] && fdernier == me);
}
void ffin_sc(int me, int other) {
fdemande[me] = false;
}
void incrementeur_fpeterson(int me, int other) {
for(int i=0; i < NBINC; i++) {
fdebut_sc(me, other);
compteur++;
ffin_sc(me, other);
}
}
/* Peterson */
/* avec ecritures synchro. par C++ */
/* semantique seq. (le defaut) */
atomic_bool demande[2] = {};
atomic_int dernier;
void debut_sc(int me, int other) {
demande[me] = true;
dernier = me;
while (demande[other] && dernier == me);
}
void fin_sc(int me, int other) {
demande[me] = false;
}
void incrementeur_peterson(int me, int other) {
for(int i=0; i < NBINC; i++) {
debut_sc(me, other);
compteur++;
fin_sc(me, other);
}
}
int main(int argc, char **argv) {
cout << u8"** Increm. sans Peterson **" << endl;
thread t1 = thread(incrementeur, 0, 1);
thread t2 = thread(incrementeur, 1, 0);
t1.join();
t2.join();
cout << compteur << "/" << NBINC * 2 << endl;
compteur = 0;
cout << u8"** Increm. Peterson + volatile **" << endl;
thread t3 = thread(incrementeur_fpeterson, 0, 1);
thread t4 = thread(incrementeur_fpeterson, 1, 0);
t3.join();
t4.join();
cout << compteur << "/" << NBINC * 2 << endl;
cout << u8"** Increm Peterson + atomic var **" << endl;
compteur = 0;
thread t5 = thread(incrementeur_peterson, 0, 1);
thread t6 = thread(incrementeur_peterson, 1, 0);
t5.join();
t6.join();
cout << compteur << "/" << NBINC * 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