我们正在尝试将节点添加到一个线程中的链表中,并从另一个线程中的链表中删除节点。
我们认为以下行是我们的问题: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);
答案 0 :(得分:3)
基本上,head
以NULL
开头,并在程序的生命周期内保持NULL
。 NULL
指针传递给wakeThread
,llnode->time
继续取消引用它(addThread
)。这就是触发段错误的原因。
要解决此问题,您需要确保head
wakeThread
对head
所做的任何更改都可见{{1}}。一种方法是将指针传递给{{1}}两个线程。如果这样做,请确保锁定正确!
答案 1 :(得分:2)
head
中的 main()
是指向struct node
的指针。它被初始化为NULL
并传递给线程函数。他们都收到NULL
指针。然后,addThread()
可能会使用insert()
增加自己的节点列表,但wakeThread()
绝对不会使用deleteNode()
删除任何节点列表,因为它不会拥有正确的指针,它只有一个NULL指针,它试图取消引用和崩溃。