一、序言
在linux驱动中需要创建多线程,实现同一时刻执行多个任务。这个时候我们就需要内核机制----kthread。
二、内核API
1.创建线程:
struct task_struct *ret = kthread_create(threadfn, data, namefmt, arg...);
2.唤醒线程:
将创建好的线程句柄传入该函数即可运行线程。
int wake_up_process(struct task_struct *tsk);
3.一键创建kthread:
其实就是将1,2合并而已。
#define kthread_run(threadfn, data, namefmt, ...)
({
struct task_struct *__k
= kthread_create(threadfn, data, namefmt, ## __VA_ARGS__);
if(!IS_ERR(__k))
wake_up_process(__k);
__k;
})
4.线程绑定到cpu
void kthread_bind(struct task_struct*k, unsigned int cpu)
5.停止某个kthread
int kthread_stop(struct task_struct *k);
6.判断当前kthread是否需要停止
int kthread_should_stop(void)
三、demo程序
static int threadfn(void * __dev)
{
while(!kthread_should_stop()) {
}
return 0;
}
int probe()
{
struct task_struct *th;
th = kthread_run(threadfn, dev, "threadfn_name");
if (IS_ERR(th)) {
dev_err(dev, "unable to start control thread\n");
goto errout;
}
//...
errout:
return 0;
}