Мы пытаемся добавить узлы в связанный список в одном потоке и удалить узлы из связанного списка в другом потоке.
Мы считаем, что следующей строкой является наша проблема: if (time (NULL))== llnode-> time). Мы пытаемся получить доступ к времени в главном узле списка.Я не уверен, передаем ли мы правильные аргументы в функции.Поток для создания узлов работает правильно, а поток для удаления узлов - нет.Это приводит к ошибке сегментации.Было бы очень признательно, если бы кто-то мог указать мне правильное направление, так как я застрял на этом некоторое время.
/* Link list node */
struct node
{
int roomNo;
time_t time;
struct node* next;
};
void * addThread(void *n)
{
struct node *llnode = n;
time_t date;
int room;
struct tm * timeptr;
pthread_mutex_lock(&lock);
while (pending < 5)
{
printf("Adding node.\n");
insert(&llnode, getRandRoom(), getRandTime());
date = getRandTime();
room = getRandRoom();
timeptr = localtime(&date);
printf("Registered: %d %s", room, asctime(timeptr));
sleep(1);
pending++;
}
pthread_mutex_unlock(&lock);
}
void * wakeThread(void *n)
{
struct node *llnode = n;
while(1)
{
if(time(NULL) == llnode->time)
{
printf("Deleting head node.\n");
pthread_mutex_lock(&lock);
deleteNode(&llnode);
pending--;
expired++;
pthread_mutex_unlock(&lock);
}
}
}
int main()
{
struct node* head;
head = NULL;
signal(SIGINT, ctrlc_catch);
pthread_t addWakeup, makeWakeup;
pthread_create(&addWakeup, NULL, addThread, (void*)head);
sleep(6);
pthread_create(&makeWakeup, NULL, wakeThread, (void*)head);
pthread_join(addWakeup, NULL);
pthread_join(makeWakeup, NULL);
return 0;
}
Вот прототипы для наших функций, которые не показаны вкод (функции были протестированы вне потоков и полностью функциональны):
void insert(struct node** head_ref, int new_room, time_t new_time);
void deleteNode(struct node** head_ref);