无法使用pthread_mutex_lock同步2个以上的线程

时间:2015-05-13 23:13:27

标签: c pthreads mutex

所以我正在为我的C课做作业,我遇到了一个问题。我想用pthread_mutex_lock()将acess同步到我的全局数组,但似乎当2个或更多线程试图同时锁定它只是bug。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

#define NUM_THREADS 10
#define VAL 10


int numbers[49];

pthread_mutex_t mutex;


typedef struct {
    int start;
    int* vec;
} dados;

void* threadFunction(void *arg){
    dados* d = (dados*) arg;
    int i = 0;
    int j = 0;
    int count[49];
    memset(count, 0, 49);
    for(i = 0; i < 49; i++){    
        for(j = d->start; j < (d->start + VAL); j++) {
            if(d->vec[j] == i+1)
                count[i] = d->vec[j];
        }
    }

    pthread_mutex_lock(&mutex);
    for(i = 0; i < 49; i++) {       
        numbers[i]+= count[i];  
    }
    pthread_mutex_unlock(&mutex);
    free(d);
    pthread_exit(NULL);
}

int main(int argc, char** argv){
    srand(time(NULL));
    /*=============== Threads ================*/
    pthread_mutex_init(&mutex, NULL);
    pthread_t threads[NUM_THREADS];
    /*========================================*/
    int vec[NUM_THREADS * VAL];
    int i;

    for(i = 0; i < NUM_THREADS * VAL; i++)
        vec[i] = (int)(rand() % 49 + 1);

    for(i = 0; i < NUM_THREADS; i++) {
        dados* d = malloc(sizeof(dados));
        d->start = i*VAL;
        d->vec = vec;
        pthread_create(&threads[i], NULL, threadFunction, d);
    }
    for(i = 0; i < NUM_THREADS; i++)
        pthread_join(threads[i], NULL); 

    pthread_mutex_destroy(&mutex);

    for(i = 0 ; i < 49; i++)
        printf("NUMERO %d = %d\n", i+1, numbers[i]);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

两个错误

memset(count, 0, 49);

应该是:

memset(count, 0, sizeof(count));

和..

           count[i] = d->vec[j];

应该是:

           count[i]++;