On souhaite écrire une petite librairie implantant une pile d'entiers. Sa taille sera statique, et determinée au moment
de sa création. Voici l'interface :
```c
stack_t * stack_create(int max_size);
```
crée une pile de taille `max_size`
```c
int stack_destroy(stack_t *s);
```
détruit la pile
```c
int stack_push(stack_t *s, int val);
```
empile la valeur `val` renvoie 1 en cas de succès, 0 sinon.
```c
int stack_pop(stack_t *s,int *val);
```
dépile dans `*val`. renvoie 1 en cas de succès, 0 sinon.
( Décider ce que contiendra la structure stack_t définissant un objet de type pile et penser à insérer des assertions dans le code aux endroits nécessaires.)
1. Testez votre implantation avec une utilisation monothreadé.
2. Testez votre implantation avec ube utilisation multithreadé (une même pile utlisé par plusieurs threads). Cela fonctionne-t-il ?
3. Ajoutez des primitives d'exclusions mutuelles afin de garantir un comportement cohérent et déterministe dans le cas d’une exécution multi-threadée.
#### Ex4 (Mutltiplication matrice/vecteur, problème du false sharing)
Le but de l'exercice est de parallèliser le calcul du produit matrice/vecteur.
Pour rappel, le produit d'une matrice `A[N][P]` par un vecteur `x[P]` donne un vecteur
`y[N]` par :
```c
for(i=0;i<N;i++){
y[i]=0;
for(j=0;j<P;j++)
y[i] += A[i][j]*x[j]
}
```
1. Écrire un programme qui prend en argument un entier `n`, et qui crée autant de threads pour
le cacul du produit. Chaque thread recevra en argument l'intervalle des indices `i in [start,end]` pour lequels il doit
effectuer le calcul `y[i]`. Pour le test, utilisez des matrices de type `int` en variables globales préalablement
[ chaque processeur utilise un cache de premier niveau (L1) dont les lignes font
64 octets. Les composantes du vecteur `y` ne sont pas accèder de manière concurrente. Mais il se peut qu'une ligne d'un cache contienne une composante écrite par un autre thread dans un autre cache rendant la ligne ```dirty``` ]