我有一个sysfs
接口,在写入时应该阻止写入任务执行,直到满足某些条件。
取消阻止的条件是:
if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
// Unblock task and let it run again
}
由于条件的性质,我认为schedule_timeout
是正确的使用机制;或者至少,我还没弄清楚如何使用它,然后取消等待时间/适当地发出信号。
我还尝试在sysfs
写:
...
__set_current_state(TASK_INTERRUPTIBLE);
schedule();
...
然后当条件满足时:
if(tsk->wait_time > MAX_WAIT_PERIOD || tsk->condition_met) {
set_task_state(tsk, TASK_RUNNING);
}
这导致:BUG: scheduling while atomic: dummyThread/2622/0x00000002
鉴于schedule_timeout
几乎几乎完全相同的逻辑,我怀疑它也会导致相同的BUG: scheduling while atomic: ...
错误。
我还尝试过deactivate_task
和activate_task
方法,但它们会导致调度程序pick_next_task
链中的内核出现混乱。如果需要,我将重新实现并发布堆栈跟踪。
在满足某些条件之前阻止任务运行的正确方法是什么?
答案 0 :(得分:1)
schedule_timeout()
是定时等待的良好低级功能。
但set_task_state()
是唤醒的不错选择:此函数主要用于当前线程。相反,请使用wake_up_process
或wake_up_state
。