我有两个内核线程,我试图以交替的方式从这两个线程打印。我正在使用信号量来同步这两个线程。
int kthread_1_function(void *data)
{
while(1)
{
down(&lock);
pr_alert("In Kernel Thread 1!!!\n");
up(&lock);
//kthread_should_stop must be used to check if this thread should be stopped
if(kthread_should_stop())
return 1;
}
return 0;
}
同样,我还有一个名为kthread_2_function的线程。在init模块中,我创建了这些内核线程(kthread_run
),cleanup_module停止了这些线程(kthread_stop
)。
以下是我对我尝试的各种事情的观察。
msleep(1000)
或mdelay(1000)
时,我会看到备用打印件。 msleep(1000)
时,打印不是交替的。 mdelay(1000)
函数调用后,我看到了备用打印件,但是当我删除模块时,完整系统冻结有人可以帮助我理解上述观察结果。
答案 0 :(得分:0)
单信号量不会给你交错保证。您需要两个信号量才能强制执行交错。 E.g。
kthread_1_function:
down(&lock1);
pr_alert("In Kernel Thread 1!!!\n");
up(&lock2);
kthread_2_function:
down(&lock2);
pr_alert("In Kernel Thread 2!!!\n");
up(&lock1);
你需要在卸载模块之前取消阻塞信号量,让线程正常关闭。