des trucs
authorPaul Kocialkowski <contact@paulk.fr>
Mon, 4 May 2015 19:11:25 +0000 (21:11 +0200)
committerPaul Kocialkowski <contact@paulk.fr>
Mon, 4 May 2015 19:11:25 +0000 (21:11 +0200)
thread.c [new file with mode: 0644]
thread.diff [new file with mode: 0644]

diff --git a/thread.c b/thread.c
new file mode 100644 (file)
index 0000000..0f697cd
--- /dev/null
+++ b/thread.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2015 Paul Kocialkowski <contact@paulk.fr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <pthread.h>
+
+/* Structure des données. */
+struct data {
+       int value[10];
+       int n;
+};
+
+void *thread_random(void *arg)
+{
+       struct data *data;
+
+       if (arg == NULL)
+               return;
+
+       /* On récupère les données avec l'argument. */
+       data = (struct data *) arg;
+
+       while (1) {
+               /* On tire une valeur au hasard. */
+               data->value[data->n] = rand();
+
+               data->n++;
+               /* On réinitialise le compte toutes les 10 valeurs. */
+               data->n %= 10;
+       }
+
+       return NULL;
+}
+
+int main(int argc, char *argv[])
+{
+       struct data *data;
+       pthread_t thread;
+       unsigned int i;
+       int average;
+       int rc;
+
+       /* On alloue la mémoire pour les données */
+       data = (struct data *) malloc(sizeof(struct data));
+       if (data == NULL)
+               return 1;
+
+       memset((void *) data, 0, sizeof(struct data));
+
+       /* On initialise le générateur aléatoire. */
+       srand(246);
+
+       /* On créé le fil d'exécution séparé. */
+       rc = pthread_create(&thread, NULL, &thread_random, (void *) data);
+       if (rc < 0)
+               return 1;
+
+       while (1) {
+               /* On vérifie qu'il y a des données. */
+               if (data->n == 0)
+                       continue;
+
+               average = 0;
+
+               /* On calcule la moyenne. */
+
+               for (i = 0; i < data->n ; i++)
+                       average += data->value[data->n];
+
+               /* Normalement, on a vérifié data->n !=0. */
+               average /= data->n;
+
+               printf("Moyenne : %d\n", average);
+       }
+
+       free(data);
+
+       return 0;
+}
diff --git a/thread.diff b/thread.diff
new file mode 100644 (file)
index 0000000..81709a1
--- /dev/null
@@ -0,0 +1,67 @@
+diff --git a/thread.c b/thread.c
+index 0f697cd..f5be80b 100644
+--- a/thread.c
++++ b/thread.c
+@@ -22,6 +22,7 @@
+ /* Structure des données. */
+ struct data {
++      pthread_mutex_t mutex;
+       int value[10];
+       int n;
+ };
+@@ -37,12 +38,16 @@ void *thread_random(void *arg)
+       data = (struct data *) arg;
+       while (1) {
++              pthread_mutex_lock(&data->mutex);
++
+               /* On tire une valeur au hasard. */
+               data->value[data->n] = rand();
+               data->n++;
+               /* On réinitialise le compte toutes les 10 valeurs. */
+               data->n %= 10;
++
++              pthread_mutex_unlock(&data->mutex);
+       }
+       return NULL;
+@@ -63,6 +68,8 @@ int main(int argc, char *argv[])
+       memset((void *) data, 0, sizeof(struct data));
++      pthread_mutex_init(&data->mutex, NULL);
++
+       /* On initialise le générateur aléatoire. */
+       srand(246);
+@@ -72,9 +79,13 @@ int main(int argc, char *argv[])
+               return 1;
+       while (1) {
++              pthread_mutex_lock(&data->mutex);
++
+               /* On vérifie qu'il y a des données. */
+-              if (data->n == 0)
++              if (data->n == 0) {
++                      pthread_mutex_unlock(&data->mutex);
+                       continue;
++              }
+               average = 0;
+@@ -86,9 +97,13 @@ int main(int argc, char *argv[])
+               /* Normalement, on a vérifié data->n !=0. */
+               average /= data->n;
++              pthread_mutex_unlock(&data->mutex);
++
+               printf("Moyenne : %d\n", average);
+       }
++      pthread_mutex_destroy(&data->mutex);
++
+       free(data);
+       return 0;