одновременно связанный список с блокировками, генерирующими ошибку сегментации (дамп ядра) каждый раз, когда я пытаюсь запустить его - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь просто вставить в параллельный связанный список. мой код всегда дает мне ошибку сегментации (ядро сброшено), когда я пытаюсь использовать функцию list_insert, и я не могу понять, почему. Начиная с пустого списка, в котором запущены два потока одновременно, я пытаюсь вставить 1 миллион случайных целых чисел в каждый список. Я приложил свой код. Спасибо за помощь

// basic node structure
typedef struct __node_t {
int key;
struct __node_t *next;
} node_t;


//basic list structure (one used per list)
    typedef struct __list_t {
    node_t *head;
    pthread_mutex_t lock;
} list_t;`

void List_Init(list_t *L) {
L->head == NULL;
pthread_mutex_init(&L->lock, NULL);
}

void List_Insert(list_t *L, int key) {
// synchronization not neded
node_t *new = malloc(sizeof(node_t));
if (new == NULL){
    perror("malloc");
    return;
}
new->key = key;

// just lock cricical section
pthread_mutex_lock(&L->lock);
new->next = L->head;
L->head = new;
pthread_mutex_unlock(&L->lock);
}

Основная функция

//main function 
int main(int argc, char** argv){

// create random number
srand(time(0));

//create list
list_t *the_list;
List_Init(the_list);

struct timeval start, stop;

// start of timer
gettimeofday(&start, NULL);

printf(" %d ", rand());
List_Insert(the_list, 1);

//stop timer
gettimeofday(&stop, NULL);

//get time passed
double time;

time = (stop.tv_sec - start.tv_sec) * 1e6;
time = (time + (stop.tv_usec - start.tv_usec)) * 1e-6;

printf("Time Passed: %f\n", time);

return 0;
...