【发布时间】:2016-12-19 10:46:22
【问题描述】:
我需要创建三个具有对linkedlist 的共享访问权限的线程:搜索、添加、删除线程。搜索线程仅浏览列表。添加线程在列表末尾添加项目,它们是互斥的(受互斥锁保护),但您可以同时搜索和添加。删除线程从列表中的任何点删除项目,它们与添加和搜索互斥。
我的链表:
struct node
{
int data;
struct node *next;
}
void search(int num)
{
int flag = 0;
struct node *temp;
temp = start;
while(temp!=NULL)
{
if(temp->data == num)
return(temp); //Found
temp = temp->next;
}
if(flag == 0)
return(start); // Not found
}
void insert(int num)
{
int c=0;
struct node *temp;
temp=head;
if(temp==NULL)
{
add(num);
}
else
{
while(temp!=NULL)
{
if(temp->data<num)
c++;
temp=temp->next;
}
if(c==0)
add(num);
else if(c<count())
addafter(num,++c);
else
append(num);
}
}
int delete(int num)
{
struct node *temp, *prev;
temp=head;
while(temp!=NULL)
{
if(temp->data==num)
{
if(temp==head)
{
head=temp->next;
free(temp);
return 1;
}
else
{
prev->next=temp->next;
free(temp);
return 1;
}
}
else
{
prev=temp;
temp= temp->next;
}
}
return 0;
}
如果有人能告诉我如何处理线程和互斥锁,我将非常感激
【问题讨论】:
-
你已经有了这三个函数的代码。尝试将每个都放在一个线程上。使用互斥锁保护关键部分。
-
注意,搜索如何返回任何内容?这是一个空白。
-
你搞砸了你的列表名称。在一个函数中使用
start,而在其他函数中使用head。也许您根本不应该在列表中使用全局变量。 -
你的搜索功能也坏了。您无法区分在第一个节点中找到您的价值和根本没有找到它。您应该返回
NULL而不是start,当然函数签名必须从void更改为struct node*作为返回类型。 -
有几种方法可以做到这一点。请参阅此链接中的信息cs.nyu.edu/courses/fall05/G22.2631-001/lists.slides2.pdf它是在java中,但原理是相同的
标签: c multithreading linked-list