首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

linux内核多线程求解解决办法

2013-07-01 
linux内核多线程求解#include linux/kernel.h#include linux/module.h#include linux/kthread.h#inc

linux内核多线程求解
#include "linux/kernel.h"
#include "linux/module.h"
#include "linux/kthread.h"
#include "linux/sched.h"
#include "linux/wait.h"
#include "linux/delay.h"
static struct task_struct *_task1;
static int thread_func(void * data)
{
wait_queue_head_t timeout_wq;
int j,k,timeout;
static int i=0;
i++;
j=0;
k=i;
printk("<1>""thread_func %d started\n",i);
init_waitqueue_head(&timeout_wq);
while(!kthread_should_stop())
{

printk("<1>""go!\n");
interruptible_sleep_on_timeout(&timeout_wq, HZ); 

printk("<1>""[%d]sleeping..%d\n", k, j++);  
}
return 0;
}
static int __init kthread_init(void)
{
_task1=kthread_create(thread_func,NULL,"func");
mdelay(1000);
printk("<1>""wake up process!\n");
wake_up_process(_task1);
printk("<1>""ok1!\n");
mdelay(2);
while(1);
//kthread_stop(_task1);
return 0;
}
static int __exit kthread_exit(void)
{
return 0;
}
module_init(kthread_init);
module_exit(kthread_exit);
MODULE_LICENSE("GPL");
为什么thread_func线程没有输出呢,已经唤醒线程了呀!
[解决办法]
你这个内核模块加载会出现什么情况呢?我按你的写法,加载时连内核都阻塞了!
[解决办法]

引用:
难道没有人知道怎么回事吗?
把kthread_init里面的while(1);去掉,不然会阻塞内核,你说的打印信息的问题:通过dmesg命令可以看到:
demsg后输出的最后几行:
……
[  470.779132] wake up process!
[  470.779214] ok1!
[  470.783398] thread_func 1 started
[  470.783417] go!
[  471.779283] [1]sleeping..0
[  471.779290] go!
[  472.776424] [1]sleeping..1
[  472.776428] go!
[  473.773532] [1]sleeping..2
[  473.773536] go!
[  474.770671] [1]sleeping..3
[  474.770675] go!
[  475.767820] [1]sleeping..4
[  475.767825] go!
[  476.764960] [1]sleeping..5


[  476.764964] go!
[  477.762097] [1]sleeping..6
[  477.762100] go!
[  478.759261] [1]sleeping..7
[  478.759265] go!
[  479.756389] [1]sleeping..8
[  479.756393] go!
[  480.753440] [1]sleeping..9
[  480.753444] go!
[  481.750676] [1]sleeping..10
[  481.750680] go!
应该是你想到的吧,至于为什么不会打印到串口,这根打印级别有点关系:你参考博文
http://blog.csdn.net/gqb666/article/details/8789807,这里有打印级别相关的东西。祝好运!
[解决办法]

引用:
while(1)把内核阻塞了,但进程已经唤醒了。我就是想while(1)也存在的情况下,打印出上面的消息
不知道你要放while(1)在这的目的是什么,而且在线程外部?感觉这个while(1)在这里的结果只会阻塞内核,即使有打印信息,但系统已经死了,我们也无法看到。除非你把打印信息输出到一个文件,我们重启系统再看该文件内是否有打印信息。

热点排行