c - semaphore.c 中的等待列表实现

标签 c list linux-kernel semaphore

这是semaphore.h中的信号量结构

16 struct semaphore {
17         raw_spinlock_t          lock;
18         unsigned int            count;
19         struct list_head        wait_list;
20 };

这是semaphore.c中的等待队列结构。

193 struct semaphore_waiter {
194         struct list_head list;
195         struct task_struct *task;
196         int up;
197 };

函数内部有以下 3 个语句。

207         struct task_struct *task = current;
208         struct semaphore_waiter waiter;
209 
210         list_add_tail(&waiter.list, &sem->wait_list);

我知道 list_add_tail 会将 waiter.list 添加到 sem->wait_list 的尾部。我不明白的是,由此产生的结构。由于 waiter.list 属于 semaphore_waitersem->wait_list 属于 struct semaphore,那么生成的列表是否为是 struct semaphore 还是 struct semaphore_waiter 类型?

最佳答案

list_add_tail :

void list_add_tail(struct list_head * new,
                   struct list_head * head);

new 添加到 head 指向的列表的开头。

请注意,内核中的大多数列表都将 next/prev 指针作为 list_head 结构,它是 列表本身中数据的结构

因此,当您遍历列表时(例如 p = p->next),next 指针不会指向数据的开头(此处为 struct semaphore_waiter),但而不是到该结构的list成员

要获取指向列表中包含的数据的指针,您可以使用 container_of宏。这将返回指向包含 list 的结构的指针。

因此,假设您有一个 struct semaphore *sem,为了简单起见,我们假设它在列表中有一个 semaphore_waiter。我们可以获得指向该服务员的指针,例如:

struct semaphore *sem = <something>;
struct list_head *first;
struct semaphore_waiter *waiter;

// This is a pointer to the 'list' member of the first
// semaphore_waiter in the list
first = sem->wait_list.next;

// Now we "back out" from the list member to the
// (containing) semaphore_waiter itself
waiter = container_of(first, struct semaphore_waiter, list);

关于c - semaphore.c 中的等待列表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22651692/

相关文章:

linux-kernel - 尝试将 Linux menuconfig 与 yocto/morty 一起使用

android - 无法理解linux命令的输出

database - Haskell 中的电影数据库

list - curl 并并行获取 100 个 URL

c - C 中的 random(int) 和 randomize()

c - 有没有办法让一个数组在 c 中保存其他数组?

java - 比较两个列表 - 寻找更快、更有效的方法

c++ - USB 到 USB 通信

c++ - 生成带有像素的图像的库

c - 从文件 C 中的单行读取多个变量类型