在 "waiting" 线程中定义的结构完成类型的自动变量上调用 complete()
Calling complete() on automatic variable of type struct completion defined in "waiting" thread
我试图在一段代码中理解补全的使用。
基本上,一个内核线程会创建自动变量结构完成,我假设它是在线程的堆栈上分配的。然后它将完成结构的指针推送到另一个线程(使用 fifo)并等待完成。
struct completion done;
init_completion(&done);
push_to_fifo(&done);
wait_for_completion(&done);
第二个线程从fifo中获取请求,处理它并完成任务。
是否可以从调用 complete(done) 的第二个线程访问 done 变量?
第一个线程正在等待第二个线程完成,因此其堆栈上的 struct completion
将稳定到 wait_for_completion
returns 之后。
该结构所在的堆栈space只是常规内存,与堆分配的内存相同。唯一的区别是,一旦此函数 returns 及其调用者调用不同的函数,相同的内存将重新用于下一个函数的堆栈帧/局部变量。
因此,如果另一个线程在那之后访问该结构,那将是一个问题,但关键是它应该在那时完成并且一旦它发出信号 "done",它应该再次触摸那段记忆。
我试图在一段代码中理解补全的使用。
基本上,一个内核线程会创建自动变量结构完成,我假设它是在线程的堆栈上分配的。然后它将完成结构的指针推送到另一个线程(使用 fifo)并等待完成。
struct completion done;
init_completion(&done);
push_to_fifo(&done);
wait_for_completion(&done);
第二个线程从fifo中获取请求,处理它并完成任务。
是否可以从调用 complete(done) 的第二个线程访问 done 变量?
第一个线程正在等待第二个线程完成,因此其堆栈上的 struct completion
将稳定到 wait_for_completion
returns 之后。
该结构所在的堆栈space只是常规内存,与堆分配的内存相同。唯一的区别是,一旦此函数 returns 及其调用者调用不同的函数,相同的内存将重新用于下一个函数的堆栈帧/局部变量。
因此,如果另一个线程在那之后访问该结构,那将是一个问题,但关键是它应该在那时完成并且一旦它发出信号 "done",它应该再次触摸那段记忆。