Проблема передачи структуры в функцию потока в C - PullRequest
1 голос
/ 15 декабря 2011

Мы пытаемся добавить узлы в связанный список в одном потоке и удалить узлы из связанного списка в другом потоке.

Мы считаем, что следующей строкой является наша проблема: 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);

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

По сути, head начинается с NULL и остается NULL на протяжении всего срока действия вашей программы. Указатель NULL передается в wakeThread, что приводит к его разыменованию (llnode->time). Это то, что вызывает segfault.

Для исправления необходимо убедиться, что любые изменения, которые addThread вносит в head, видны для wakeThread. Один из способов сделать это - передать указатель на head в оба потока. Если вы сделаете это, убедитесь, что вы правильно установили блокировку!

2 голосов
/ 15 декабря 2011

head в main() - указатель на struct node.Он инициализируется до NULL и передается функциям потока.Они оба получают указатель NULL.Тогда addThread() может быть в состоянии увеличить свой собственный список узлов с помощью insert(), но wakeThread() определенно не собирается удалять ни один из них с помощью deleteNode(), потому что у него просто нет правильного указателя, все, что у него естьэто пустой указатель, который он пытается разыскивать и вылетает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...