繁体   English   中英

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

[英]Linux Kernel Threads with semaphore freeze

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

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. 当我在两个线程中再次调用up函数后使用msleep(1000)时,打印不会交替显示。
  4. 当我在两个线程中的up函数调用之后使用mdelay(1000) ,我会看到备用打印,但是当我删除模块时,整个系统将冻结

有人可以帮我理解上述观点吗?

单个信号量不会给您提供交错保证。 您需要两个信号量才能执行交织。 例如

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

而且,在卸载模块之前,需要先解除阻塞信号量,以使线程正常关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM