Вы не синхронизируете доступ к переменной-данным.Что происходит, так это то, что компилятор сгенерирует бесконечный цикл.Вот почему:
while( 1 )
{
if( data >= 2 )
{
kthread_stop(t1);
kthread_stop(t2);
break;
}
}
Компилятор может обнаружить, что значение данных никогда не изменяется в цикле while.Поэтому он может полностью вывести проверку из цикла, и вы получите простой
while (1) {}
Если вы вставите printk, компилятор должен предположить, что данные глобальной переменной могут измениться (в конце концов -компилятор понятия не имеет, что делает printk в деталях), поэтому ваш код снова начнет работать (с неопределенным поведением) ..
Как это исправить:
Использовать правильную синхронизацию потоковпримитивы.Если вы свернете доступ к данным в секцию кода, защищенную мьютексом, код будет работать.Вы также можете заменить переменные данные и использовать подсчитанный семафор.
Редактировать:
Эта ссылка объясняет, как работает блокировка в ядре linux:
http://www.linuxgrill.com/anonymous/fire/netfilter/kernel-hacking-HOWTO-5.html