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;
}
Ejemplo n.º 2
0
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;
}