我尝试在一段代码中理解完成的使用。
基本上,一个内核线程创建自动变量struct completion,我假设它是在线程的堆栈上分配的。然后它将完成结构的指针推送到另一个线程(使用fifo)并等待完成。
struct completion done;
init_completion(&done);
push_to_fifo(&done);
wait_for_completion(&done);
第二个线程从fifo获取请求,处理它并完成任务。
是否可以从调用完成(完成)的第二个线程访问done变量?
答案 0 :(得分:0)
第一个线程正在等待第二个线程完成,因此其堆栈上的struct completion
将保持稳定,直到wait_for_completion
返回。
该结构所在的堆栈空间只是常规内存,与堆分配的内存相同。唯一的区别是,一旦此函数返回,并且其调用者调用不同的函数,相同的内存将被重用于下一个函数的堆栈帧/局部变量。
所以,如果另一个线程在该点之后访问该结构,那将是一个问题,但关键是应该在那时完成并且一旦它发出“完成”信号,它就不应该触及记忆了。