天天看點

信号量實作核心線程同步例子

#include <linux/init.h>

#include <linux/module.h>

#include <linux/sched.h>

#include <asm-i386/semaphore.h>

MODULE_LICENSE("GPL");

int num[2][5] = 

{

{0, 2, 4, 6, 8},

{1, 3, 5, 7, 9}

};

struct semaphore sem_first;

struct semaphore sem_second;

int thread_print_first(void *);

int thread_print_second(void *);

int thread_print_first(void *p)

{

int i;

int *num = (int *)p;

for(i = 0; i < 5; i++)

{

down(&sem_first);

printk("Hello World : %d\n", num[i]);

up(&sem_second);

}

return 0;

}

int thread_print_second(void *p)

{

int i;

int *num = (int *)p;

for(i = 0; i < 5; i++)

{

down(&sem_second);

printk("Hello World : %d\n", num[i]);

up(&sem_first);

}

return 0;

}

static int hello_init(void)

{

printk(KERN_ALERT"Hello World enter\n"); 

    init_MUTEX(&sem_first); 

    init_MUTEX_LOCKED(&sem_second); 

    kernel_thread(thread_print_first,num[0],CLONE_KERNEL); 

    kernel_thread(thread_print_second,num[1],CLONE_KERNEL); 

    return 0; 

}

static void hello_exit(void) 

    printk(KERN_ALERT"hello world exit\n"); 

module_init(hello_init); 

module_exit(hello_exit); 

MODULE_AUTHOR("Niu Tao"); 

MODULE_DESCRIPTION("A simple hello world Module"); 

MODULE_ALIAS("a simplest module");

繼續閱讀