1 使用kthread_create创建线程:
struct task_struct *kthread_create(int (*threadfn)(void *data),
void *data,
const char *namefmt, ...);
这个函数可以像printk一样传入某种格式的线程名
线程创建后,不会马上运行,而是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运行线程。
2. 当然,还有一个创建并启动线程的函数:kthread_run
struct task_struct *kthread_run(int (*threadfn)(void *data),
void *data,
const char *namefmt, ...);
3. 线程一旦启动起来后,会一直运行,除非该线程主动调用do_exit函数,或者其他的进程调用kthread_stop函数,结束线程的运行。
int kthread_stop(struct task_struct *thread);
kthread_stop() 通过发送信号给线程。
如果线程函数正在处理一个非常重要的任务,它不会被中断的。当然如果线程函数永远不返回并且不检查信号,它将永远都不会停止。
参考:Kernel threads made easy
--
在执行kthread_stop的时候,目标线程必须没有退出,否则会Oops。原因很容易理解,当目标线程退出的时候,其对应的task结构也变得无效,kthread_stop引用该无效task结构就会出错。
为了避免这种情况,需要确保线程没有退出,其方法如代码中所示:
thread_func()
{
// do your work here
// wait to exit
while(!thread_could_stop())
{
wait();
}
}
exit_code()
{
kthread_stop(_task); //发信号给task,通知其可以退出了
}
这种退出机制很温和,一切尽在thread_func()的掌控之中,线程在退出时可以从容地释放资源,而不是莫名其妙地被人“暗杀”。
分享到:
相关推荐
资源中是KThread和TCB的构造顺序分析PPT文件
彻底掌握kthread_worker队列化机制kthread_init_worker()宏初始化kthread_worker__kthread_init_wor
kthread_create():创建内核线程 代码如下:struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], …); kernel thread可以用kernel_thread创建,但是在执行函数里面...
本次课程设计应用MATLAB实现连续信号的采样,验证抽样定理以及与重构仿真,了解MATLAB软件,学习应用MATLAB软件的仿真技术。它主要侧重于某些理论知识的灵活运用,以及一些关键命令的掌握,理解,分析等。...
山东大学操作系统实验课实验7&实验8,时间2012年12月
您与内核线程的交互将通过调用kthread列出的kthread函数来kthread.h 。 由于您实际上是在实现操作系统的上下文切换部分,因此您会发现在教科书中有关进程和线程的章节中引入了许多有用的概念:进程控制块,就绪队列...
山东大学操作系统课程设计nachos java源码 project 1 完整代码含测试可运行。...Task1.1 KThread.join() Task1.2 Condition2类 Task1.3 Alram类 Task1.4 Communicator类 Task1.5 PriorityScheduler类 Task1.6 Boat类
要实现系统用户态模式下加载运行可执行程序,需要在Project2的基础上,修改user.c、elf.c、userseg.c、kthread.c、sysall.c、main.c makefile的修改部分内容:删除-Werror,因为它会把所有的warning当作报错进行...
Project 1 建立线程系统 1.1 实现 KThread.join() 1.2 实现条件变量1.3完成alarm类1.4 Communicator()1.5 PriorityScheduler1.6 Boat() Phase 2 实现文件系统 2.1文件系统调用 2.2 多道程序设计 2.3 实现系统调用 ...
Project 1 建立线程系统 1.1 实现 KThread.join() 1.2 实现条件变量1.3完成alarm类1.4 Communicator()1.5 PriorityScheduler1.6 Boat() Phase 2 实现文件系统 2.1文件系统调用 2.2 多道程序设计 2.3 实现系统调用 ...
该驱动程序使用以下Linux设施:模块,平台驱动程序,文件操作(读/写,mmap,ioctl,阻止和非阻止模式,轮询),kfifo,完成,中断,tasklet,工作,kthread,计时器,简单的杂项设备,多个字符设备,设备模型,...
大部分常用系统结果 已经还原成C语言格式的 typedef struct _EPROCESS_XP_SP3 // 107 elements, 0x260 bytes (sizeof) { /*0x000*/ struct _KPROCESS_XP_SP3 Pcb; // 29 elements, 0x6C bytes (sizeof) ...
3.2.6 kthread辅助接口 56 3.2.7 错误处理助手 57 3.3 查看源代码 58 第4章 基本概念 61 4.1 设备和驱动程序介绍 61 4.2 中断处理 63 4.2.1 中断上下文 63 4.2.2 分配irq号 64 4.2.3 设备实例:...
3.2.6 kthread辅助接口56 3.2.7 错误处理助手57 3.3 查看源代码58 第4章 基本概念61 4.1 设备和驱动程序介绍61 4.2 中断处理63 4.2.1 中断上下文63 4.2.2 分配irq号64 4.2.3 设备实例:导航杆65 ...