SHARE
TWEET

peterson-working

gallir Oct 7th, 2014 (edited) 635 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. #define NUM_THREADS      2
  8. #define MAX_COUNT 1000000L
  9.  
  10. volatile long count = 0;
  11. volatile int estado[NUM_THREADS];
  12. volatile int turno;
  13.  
  14. void e_peterson(int id) {
  15.         int other = (id +1) % NUM_THREADS;
  16.  
  17.         estado[id] = 1;
  18.         turno = other;
  19.         __sync_synchronize();
  20.         while (estado[other] && turno == other);
  21. }
  22.  
  23. void s_peterson(int id) {
  24.         estado[id] = 0;
  25. }
  26.  
  27. void *counter(void *threadid) {
  28.         long tid, i, max = MAX_COUNT/NUM_THREADS;
  29.         tid = (long)threadid;
  30.  
  31.         for (i=0; i < max; i++) {
  32.                 e_peterson(tid);
  33.                 count++; //SC
  34.                 s_peterson(tid);
  35.         }
  36.  
  37.         pthread_exit(NULL);
  38. }
  39.  
  40. int main (int argc, char *argv[]) {
  41.         pthread_t threads[NUM_THREADS];
  42.         int rc;
  43.         long t;
  44.  
  45.         estado[0] = 0;
  46.         estado[1] = 0;
  47.         turno = 0;
  48.  
  49.  
  50.         for(t=0; t<NUM_THREADS; t++){
  51.                 rc = pthread_create(&threads[t], NULL, counter, (void *)t);
  52.                 if (rc){
  53.                         printf("ERROR; return code from pthread_create() is %d\n", rc);
  54.                         exit(-1);
  55.                 }
  56.         }
  57.  
  58.         for(t=0; t<NUM_THREADS; t++){
  59.                 pthread_join(threads[t], NULL);
  60.         }
  61.  
  62.         float error = (MAX_COUNT-count)/(float) MAX_COUNT *100;
  63.  
  64.         printf("Final result: %ld Expected: %ld Diff: %ld Error: %3.2f%%\n", count, MAX_COUNT, count-MAX_COUNT, error);
  65.  
  66.         puts("Bye from main");
  67.         pthread_exit(NULL);
  68. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top