#include<linux/fs.h> #include<linux/sched.h> #include<linux/kthread.h> #include<linux/module.h> #include<linux/delay.h> static int i=0,j=100; struct task_struct *MyThread1=NULL; struct task_struct *MyThread2=NULL; static int myVar = 0; static int count = 0; spinlock_t lock; static void setMyVar(int input) { spin_lock(&lock); if(count) { printk("busy setMyVar\n"); } count++; myVar = input; printk("setMyVar is %d\n",myVar); spin_unlock(&lock); count--; } static int getMyVar(void) { int res = 0 ; spin_lock(&lock); if(count) { printk("busy setMyVar\n"); } count++; res = myVar; printk("getMyVar is %d\n",res); spin_unlock(&lock); count--; return 0; } static int print1(void *data) { while(!kthread_should_stop()) { printk("this is thread1......\n"); getMyVar(); setMyVar(i); ssleep(1); i++; } return 0; } static int print2(void *data) { while(!kthread_should_stop()) { printk("this is thread2......\n"); getMyVar(); setMyVar(j); ssleep(1); j++; } return 0; } static int __init hello_init(void){ spin_lock_init(&lock); MyThread1 = kthread_run(print1,NULL,"mythread1"); MyThread2 = kthread_run(print2,NULL,"mythread2"); return 0; } static void __exit hello_exit(void){ if(MyThread1) { printk("kthread1 stop....\n"); kthread_stop(MyThread1); MyThread1=NULL; } if(MyThread2) { printk("kthread2 stop....\n"); kthread_stop(MyThread2); MyThread2=NULL; } } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Valerie Henson val@nmt.edu"); MODULE_DESCRIPTION("\"Hello, world!\" minimal module"); MODULE_VERSION("printk");