zoukankan      html  css  js  c++  java
  • linux自旋锁

    #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 ");
            }
            count++;
        myVar = input;
        printk("setMyVar is %d ",myVar);
        spin_unlock(&lock);
        count--;
    }
    static int getMyVar(void)
    {
        int res = 0 ;
            spin_lock(&lock);
            if(count)
            {
                printk("busy setMyVar ");
            }
            count++;
        res = myVar;
        printk("getMyVar is %d ",res);
        spin_unlock(&lock);
        count--;
        return 0;
    }
    static int print1(void *data)
    {
        while(!kthread_should_stop())
        {
            printk("this is thread1...... ");
            getMyVar();
            setMyVar(i);
            ssleep(1);
            i++;
        }
        return 0;
    }
    static int print2(void *data)
    {
        while(!kthread_should_stop())
        {
            printk("this is thread2...... ");
            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.... ");
            kthread_stop(MyThread1);
            MyThread1=NULL;
        }
        if(MyThread2)
        {
            printk("kthread2 stop.... ");
            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");
  • 相关阅读:
    Erlang性能的八个误区
    Unity预览
    一步步实现cnblogs博客采集工具>实现辅助对话框
    Asp.Net MVC 必备插件MVC Route Visualizer(Visual Studio 2012 版)
    IBM SOA[ESB,BPM,Portal等]基础架构图解
    PowerShell收发TCP消息包
    Sonar安装使用篇
    在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
    排序算法
    ASP.NET MVC Web API 学习增删改查
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6757728.html
Copyright © 2011-2022 走看看