自旋锁 list_for_each_entry_safe 或 list_for_each_entry 安全吗?

Is it safe to spin lock list_for_each_entry_safe or list_for_each_entry?

我想将内容添加到我的列表中,如果列表中已存在某些内容,我想在重新添加之前将其删除。这只是我自己尝试的一个练习(我知道,做这样的事情没有实际意义)

spin_lock(&mylock);
bool added = false
list_for_each_entry_safe(cur, nxt, &mylist.entries, entries)
{
    //Check to see if cur == the item I want to add, if it is add it and set my bool to true
}

//Check to see if my bool is true. If it's false, add the item to the list

spin_unlock(&mylock);

这不安全吗?问题是我无法弄清楚如何在不创建竞争条件的情况下将自旋锁放在其他任何地方。例如,如果我这样做

list_for_each_entry_safe(cur, nxt, &mylist.entries, entries)
{
spin_lock(&mylock);

    //Check to see if cur == the item I want to add, if it is add it and set my bool to true

spin_unlock(&mylock);
}

//race condition here

spin_lock(&mylock);

//Check to see if my bool is true. If it's false, add the item to the list 

spin_unlock(&mylock);

可能存在竞争条件,我在此处评论“竞争条件”,因为其他线程可能会添加该项目,然后我不知道,当前线程会再次添加该项目,所以会有列表中的重复项。

问题是我不知道是否可以将整个 list_for_each_entry 放在自旋锁的临界区内?

在持有自旋锁的同时遍历列表没有问题。毕竟,list_for_each_entry 所做的只是一个简单的 for 循环。如果您问 list_for_each_entry 是否可以睡觉,那么答案是否定的。您的第一个代码片段本身看起来是安全的(还必须查看您的其余代码才能 100% 确定它是安全的)。