Я пишу код для модуля ядра Linux и испытываю странное поведение в нем. Вот мой код:Странное поведение printk в модуле ядра linux
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");
}
В основном я пытался ждать нити, чтобы закончить, а затем напечатать что-то после этого. Вышеупомянутый код действительно достигает этой цели, но с "printk("debug\n");"
не комментируется. Как только я прокомментирую printk("debug\n");
, чтобы запустить код без отладки и загрузить модуль через команду insmod, модуль зависает, и кажется, что он потерялся в рекурсии. Я не понимаю, почему printk влияет на мой код таким большим образом?
Любая помощь будет оценена по достоинству.
Отношения.
volatile будет работать, но это всегда плохая идея, потому что вы не можете убедиться, что данные ++ являются атомарной инструкцией. В многопроцессорной системе с несколькими потоками, борющимися за одну и ту же переменную, это даст вам гарантированное условие гонки. –
Отличный пункт. Не используйте волатильность здесь. Вам нужно больше кофе. ;-) –