#include "upc.h" #include shared int A[THREADS]; upc_lock_t *shared lk[THREADS]; shared int s[THREADS]; shared int setS[THREADS]; int i, temp; int main() { int k; if(MYTHREAD==0) for(k=0;k<3;k++) { lk[k]=upc_global_lock_alloc(); s[k]=0; setS[k]=0;} upc_barrier(1); // The body of each thread starts A[MYTHREAD] = MYTHREAD; i = MYTHREAD; /* i is a thread index.*/ if(MYTHREAD==0) return 0; if(MYTHREAD==1) { int cnt0; int SS2; for (cnt0=0;cnt0<10;cnt0++) { upc_memget(&SS2, &setS[2], sizeof (int)); while (SS2 && (s[1] == 2)) upc_memget(&SS2, &setS[2], sizeof (int)); s[1] = 2; setS[1] = 1; upc_lock(lk[1]); /* Acquire locks */ upc_lock(lk[s[1]]); upc_memget(&SS2, &setS[2], sizeof (int)); while (!SS2) upc_memget(&SS2, &setS[2], sizeof (int)); upc_unlock(lk[1]); /* Unlock */ upc_unlock(lk[s[1]]); setS[1] = 0; } } else if (MYTHREAD==2) { int cnt1; int SS1; int s1; for (cnt1=0;cnt1<10;cnt1++) { upc_memget(&SS1, &setS[1], sizeof (int)); while(!SS1) upc_memget(&SS1, &setS[1], sizeof (int)); /* It gives priority to Thread 1*/ s[2] = 1; setS[2] = 1; upc_memget(&SS1, &setS[1], sizeof (int)); upc_memget(&s1, &s[1], sizeof (int)); while ((s1 != 2) || SS1) { upc_memget(&SS1, &setS[1], sizeof (int)); upc_memget(&s1, &s[1], sizeof (int));} upc_lock(lk[2]); /* Acquire locks */ upc_lock(lk[s[2]]); /* Swap */ upc_unlock(lk[s[2]]); /* Unlock */ upc_unlock(lk[2]); setS[2] = 0; } } return 0; }