Linux kernel 对“中定义的struct completion”类型的自动变量调用complete();“等待”;线

Linux kernel 对“中定义的struct completion”类型的自动变量调用complete();“等待”;线,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我试图理解一段代码中补全的用法 基本上,一个内核线程创建自动变量struct completion,我假设它是在线程堆栈上分配的。然后它将完成结构的指针推送到另一个线程(使用fifo)并等待完成 struct completion done; init_completion(&done); push_to_fifo(&done); wait_for_completion(&done); 第二个线程从fifo获取请求,处理它并完成任务 是否可以从调用complete(d

我试图理解一段代码中补全的用法

基本上,一个内核线程创建自动变量struct completion,我假设它是在线程堆栈上分配的。然后它将完成结构的指针推送到另一个线程(使用fifo)并等待完成

struct completion done;

init_completion(&done);
push_to_fifo(&done);
wait_for_completion(&done);
第二个线程从fifo获取请求,处理它并完成任务


是否可以从调用complete(done)的第二个线程访问done变量?

第一个线程正在等待第二个线程完成,因此其堆栈上的
struct completion
将保持稳定,直到
wait\u for\u completion
返回

该结构所在的堆栈空间只是常规内存,与堆分配内存相同。唯一的区别是,一旦这个函数返回,并且它的调用者调用了一个不同的函数,相同的内存就会被重新用于下一个函数的堆栈帧/局部变量


因此,如果另一个线程在该点之后访问该结构,这将是一个问题,但问题是该线程应该在该点之前完成,并且一旦它发出“完成”信号,它就不应该再触及该内存。

让我总结一下。如果我理解得好的话。由于我们在同一地址空间(内核虚拟地址空间,无需在上下文切换中更改地址映射)中执行两个线程,因此局部变量在等待之前仍然可用。返回后,本地函数堆栈将被“释放”。这是有道理的。谢谢