我正在为linux内核模块编写代码,并且遇到了一个奇怪的行为。 这里是我的代码:在linux内核模块中printk的奇怪行为
int data = 0;
void threadfn1()
{
int j;
for(j = 0; j < 10; j++)
printk(KERN_INFO "I AM THREAD 1 %d\n",j);
data++;
}
void threadfn2()
{
int j;
for(j = 0; j < 10; j++)
printk(KERN_INFO "I AM THREAD 2 %d\n",j);
data++;
}
static int __init abc_init(void)
{
struct task_struct *t1 = kthread_run(threadfn1, NULL, "thread1");
struct task_struct *t2 = kthread_run(threadfn2, NULL, "thread2");
while(1)
{
printk("debug\n"); // runs ok
if(data >= 2)
{
kthread_stop(t1);
kthread_stop(t2);
break;
}
}
printk(KERN_INFO "HELLO WORLD\n");
}
基本上我试图等待线程完成,然后打印后的东西。 上述代码确实实现了该目标,但未注释WITH "printk("debug\n");"
。只要我注释掉printk("debug\n");
以在没有调试的情况下运行代码并通过insmod命令加载模块,模块就会挂起,看起来它在递归中会丢失。我不明白为什么printk会以这么大的方式影响我的代码?
任何帮助,将不胜感激。
关于。
volatile会有些作用,但它总是一个坏主意,因为你不能确保data ++是一个原子指令。在多线程争取同一个变量的多处理器系统上,这会给你一个有保证的竞争条件。 – 2010-11-06 13:18:14
伟大的一点。这里不要使用volatile。需要更多的咖啡。 ;-) – 2010-11-06 13:22:29