麻烦将结构传递给C中的线程函数

时间:2011-12-15 15:33:27

标签: c multithreading function

我们正在尝试将节点添加到一个线程中的链表中,并从另一个线程中的链表中删除节点。

我们认为以下行是我们的问题: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 个答案:

答案 0 :(得分:3)

基本上,headNULL开头,并在程序的生命周期内保持NULLNULL指针传递给wakeThreadllnode->time继续取消引用它(addThread)。这就是触发段错误的原因。

要解决此问题,您需要确保head wakeThreadhead所做的任何更改都可见{{1}}。一种方法是将指针传递给{{1}}两个线程。如果这样做,请确保锁定正确!

答案 1 :(得分:2)

head中的

main()是指向struct node的指针。它被初始化为NULL并传递给线程函数。他们都收到NULL指针。然后,addThread()可能会使用insert()增加自己的节点列表,但wakeThread()绝对不会使用deleteNode()删除任何节点列表,因为它不会拥有正确的指针,它只有一个NULL指针,它试图取消引用和崩溃。