自旋锁 list_for_each_entry_safe 或 list_for_each_entry 是不是安全?

Posted

技术标签:

【中文标题】自旋锁 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?自旋锁 list_for_each_entry_safe 或 list_for_each_entry 是否安全? 【发布时间】:2021-12-14 06:29:33 【问题描述】:

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

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?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于自旋锁 list_for_each_entry_safe 或 list_for_each_entry 是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

自旋锁

自旋锁原理及java自旋锁

自旋锁spinlock解析

五自旋锁(spinlock)

自旋锁

自旋锁