void worker_thread(int *tid) { int i; int *current_array; long iterations = 0; while (!g_quit) { if (g_which_lock == TYPE_PTHREAD_MUTEX) { /* Critical path for pthread_rwlock_t */ pthread_mutex_lock(&pmutex); for (i = 0; i < ARRAY_SIZE; i++) array1[i]++; for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } pthread_mutex_unlock(&pmutex); } else if (g_which_lock == TYPE_PTHREAD_SPIN) { /* Critical path for pthread_spin_t */ pthread_spin_lock(&pspin); for (i = 0; i < ARRAY_SIZE; i++) array1[i]++; for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } pthread_spin_unlock(&pspin); } else if (g_which_lock == TYPE_MPSC_MUTEX) { /* Critical path for mpsc_mutex_t */ mpsc_mutex_lock(&mpscmutex); for (i = 0; i < ARRAY_SIZE; i++) array1[i]++; for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } mpsc_mutex_unlock(&mpscmutex); } else if (g_which_lock == TYPE_TICKET_MUTEX) { /* Critical path for ticket_mutex_t */ ticket_mutex_lock(&ticketmutex); for (i = 0; i < ARRAY_SIZE; i++) array1[i]++; for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } ticket_mutex_unlock(&ticketmutex); } else { /* Critical path for clh_mutex_t */ clh_mutex_lock(&clhmutex); for (i = 0; i < ARRAY_SIZE; i++) array1[i]++; for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } clh_mutex_unlock(&clhmutex); } iterations++; } printf("Thread %d, iterations = %ld\n", *tid, iterations); g_operCounters[*tid] = iterations; }
void worker_thread(int *tid) { int i; int *current_array; long iterations = 0; int ncarray[ARRAY_SIZE*10]; for (i = 0; i < ARRAY_SIZE*10; i++) ncarray[i] = 99; while (!atomic_load(&g_quit)) { if (g_which_lock == TYPE_PTHREAD_MUTEX) { /* Critical path for pthread_rwlock_t */ pthread_mutex_lock(&pmutex); for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } pthread_mutex_unlock(&pmutex); } else if (g_which_lock == TYPE_TICKET_MUTEX) { /* Critical path for ticket_mutex_t */ ticket_mutex_lock(&ticketmutex); for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } ticket_mutex_unlock(&ticketmutex); } else if (g_which_lock == TYPE_TIDEX_MUTEX) { /* Critical path for tidex_mutex_t */ tidex_mutex_lock(&tidexmutex); for (i = 1; i < ARRAY_SIZE; i++) { if (array1[i] != array1[0]) printf("ERROR\n"); } tidex_mutex_unlock(&tidexmutex); } iterations++; // Non-critical path, about 10x larger for (i = 1; i < ARRAY_SIZE*10; i++) { if (ncarray[i] != ncarray[0]) printf("ERROR\n"); } } //printf("Thread %d, iterations = %ld\n", *tid, iterations); g_operCounters[*tid] = iterations; }