我正在为linux内核开发一个补丁。我必须使用多个列表,并且我必须保护它们不受多核机器上并发修改的影响。我正在尝试使用自旋锁来实现这个目标,但是有一些事情我不能理解。我必须锁定列表的条目(我使用的是链表的linux默认实现),可能会发生这样的情况:一个进程调用syscall来删除列表中的一个元素,而相同的元素被锁定,因为实际上正在对它进行一些修改。如果我在列表条目中插入一个自旋锁,当有人在它上面进行自旋锁定时,如果进程设法删除它,会发生什么??我应该锁定整个列表吗?我正在寻找一段代码,可以解释如何处理这种情况。
例如,这段代码不应该工作(参见最后一行代码的注释):
struct list
我正在阅读一些代码,我在函数foo中看到:
// x is a global variable shared by all functions
spin_lock(&x);
if(some condition)
function();
spin_unlock(&x);
在函数()中;
// do stuff
spin_lock_irqsave(&x, vals);
....
如果“某个条件”为真,会不会出现死锁?这似乎太明显了,所以我想我可能遗漏了什么?
谢谢
编辑:代码不是linux的一部分,它只是我在网上找到的一些随机代码
我想用下面的模式编写一个循环,其中spin_lock的返回类型是void。
while(workersAvailable() && spin_lock(workQueueLock) && (!list_empty(workQueue) || spin_unlock(workQueueLock)) ) {
...
spin_unlock(workQueueLock);
//long taking work, with no need for a lock
}
推理:
我想保持锁尽可能短,不需要它为workersAvailable()
我知
我不太确定在用户模式线程中使用易失性变量是否安全,为了实现一个轻量级的spin_lock,我查看了tbb源代码tbb_machine.h:170,
//! Spin WHILE the value of the variable is equal to a given value
/** T and U should be comparable types. */
template<typename T, typename U>
void spin_wait_while_eq( const volatile T& location, U value ) {
atom
我正在使用以下API来终止一个微线程:
tasklet_kill();
在终止微线程的同时,我使用spin_lock_irqsave禁用了本地中断。为什么内核会抛出以下消息(警告?):
Attempt to kill tasklet from interrupt
在拿着spin_lock的同时使用tasklet_kill()是不明智的吗?