带有信号量冻结的Linux内核线程

时间:2014-09-12 09:57:44

标签: c multithreading module kernel semaphore

我有两个内核线程,我试图以交替的方式从这两个线程打印。我正在使用信号量来同步这两个线程。

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)。

以下是我对我尝试的各种事情的观察。

  1. 插入模块时,打印不是交替的。我假设这是因为当线程2获取锁定时,线程1重新获取锁定并再次打印。
  2. 当我在两个线程中的向下和向上函数调用之间使用msleep(1000)mdelay(1000)时,我会看到备用打印件。
  3. 当我再次在两个线程中使用函数调用后msleep(1000)时,打印不是交替的。
  4. 当我在两个线程中使用mdelay(1000)函数调用后,我看到了备用打印件,但是当我删除模块时,完整系统冻结
  5. 有人可以帮助我理解上述观察结果。

1 个答案:

答案 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);

你需要在卸载模块之前取消阻塞信号量,让线程正常关闭。