Linux内核线程的建立

本文介绍了Linux内核如何通过使用taskq_thread函数和相关头文件如<linux/sched.h>、<linux/kthread.h>、<linux/err.h>来创建线程。以usb driver为例,在resume complete时,为了提高效率,通过do_rebind_interface()启动一个独立的线程来处理设备的重新枚举任务,避免影响系统resume的速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建内核线程的函数:
thread = kthread_create(taskq_thread, tqt, "%s/%d", name, i);
wake_up_process(thread);

其中taskq_thread为该内核函数需要做的事情。

所需要包含头文件

#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/err.h>


For Example:  
resume complete时usb driver会调用do_rebind_interface() 来实现device的重新枚举。这会拖慢系统resume的速度,因此create一个线程来单独完成这件事情。

static int USBResumeSpeed_Improve(void *pvArg)		//  函数返回值必须为int型
{
	struct usb_device *udev = pvArg;
	do_rebind_interface(udev);
        return 0;
}
/* The device lock is held by the PM core */
int usb_resume_complete(struct device *dev)
{
	struct usb_device *udev = to_usb_device(dev);
	int err;
	struct task_struct *ResumeThreadStruct;
         /* For PM complete calls, all we do is rebind interfaces
          * whose needs_binding flag is set
          */
         if (udev->state != USB_STATE_NOTATTACHED)
		{
		if(udev->descriptor.idProduce == 0x7662 ){
		char ResumeThreadName[10] = "RES_WIFI";
		ResumeThreadStruct = kthread_create(USBResumeSpeed_Improve, udev, ResumeThreadName);
		if(IS_ERR(ResumeThreadStruct)) {
			err = PTR_ERR(ResumeThreadStruct);
			ResumeThreadStruct = NULL;
			return err;
			}
		wake_up_process(ResumeThreadStruct);
		}
		else{
                 do_rebind_interfaces(udev);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值