【发布时间】:2021-11-07 17:50:32
【问题描述】:
我有 2 个线程安全列表(相同类型),其中每个节点都有一个互斥锁(我知道这不是最佳解决方案,但这就是我被要求做的)。我有以下功能,我想匹配 2 个节点,每个节点来自不同的列表。逻辑是我从第一个列表中传递一个节点,然后检查第二个列表中的所有节点。
这里是节点的类型和列表:
typedef struct node_type{
//some data;
struct node_type *next;
pthread_mutex_t lock;
}node_t;
typedef struct list_type{
node_t *head;
pthread_mutex_t lock;
}list_t;
这是函数的代码:
node_t *find_match(list_t *l,node_t *n)
{
node_t *cur,*prev;
pthread_mutex_lock(&l->lock);
if(l->head == NULL)
{
pthread_mutex_unlock(&l->lock);
return NULL;
}
else
{
cur = l->head;
while(cur != NULL)
{
pthread_mutex_lock(&cur->lock);
if(n != NULL)
{
pthread_mutex_lock(&n->lock);
//comparing the data and checks for match.
}
else
{
//some message or something
return NULL;
}
if(cur == l->head)
{
pthread_mutex_unlock(&l->lock);
}
else
{
pthread_mutex_unlock(&prev->lock);
prev = cur;
cur = cur->next;
}
pthread_mutex_unlock(&prev);
return NULL;
}
}
我想提醒您注意 if 语句“n != NULL”。在那里,如果 n 不为 NULL,那么线程将尝试锁定节点的互斥锁。如果另一个线程拥有它并试图删除该节点,会发生什么?我能以某种方式避免它吗?有没有更好的写法?
【问题讨论】:
-
我首先建议对代码示例进行一些清理:(1):末尾缺少一个右大括号(2):请确保解锁您使用@987654324锁定的列表锁@在方法的每个出口。例如,在您返回“一些消息或某事”之前。 (3)由于
n != NULL在函数内部永远不会改变,所以也可以在锁定列表之前放在函数的开头。
标签: c multithreading mutex