gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:30 24 4
gpt4 key购买 nike

这是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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com