不可睡眠锁:自旋锁spinlock编码学习

来源:互联网 发布:java数组二分查找 编辑:程序博客网 时间:2024/05/16 17:34
开源力量学习笔记

自旋锁(spinlock)简介
自旋锁是内核的一种同步机制,在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。
内核可以通过自旋锁占有某些资源,直到使用完后再释放锁。如果该资源已经被其他的任务占有了,那内核会不断等待,直到获得该资源。
这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。

自旋锁(spinlock)的基本形式API
初始化:   
    在编译时定义:DEFINE
_SPINLOCK();
    在运行时初始化:spin_lock_init();
持有锁和释放锁:
    spin_lock();
//临界区
    spin_unlock();

自旋锁代码编程示例:

  1. #include <linux/module.h>
  2. #include <linux/kthread.h>
  3. #include <linux/delay.h>

  4. MODULE_LICENSE("GPL");
  5. MODULE_AUTHOR("Chen");
  6. MODULE_DESCRIPTION("The module is only used for test.");

  7. //static DEFINE_SPINLOCK(threads_lock);
  8. static spinlock_t threads_lock;

  9. static void threads_lock_init(void)
  10. {
  11.     spin_lock_init(&threads_lock);
  12. }

  13. struct our_data{
  14.     int count1;
  15.     int count2;
  16. };

  17. static struct our_data my_data;

  18. static void show_my_data(void)
  19. {
  20.     printk("count1 %d,count2 %d\n", my_data.count1, my_data.count2);
  21. }

  22. #define MAX_KTHREAD 10

  23. static struct task_struct *threads[MAX_KTHREAD];

  24. static int thread_do(void *data)
  25. {
  26.     printk("run ...\n");
  27.     while(!kthread_should_stop()){
  28.         spin_lock(&threads_lock);
  29.         my_data.count1++;
  30.         my_data.count2 += 10;
  31.         spin_unlock(&threads_lock);

  32.         msleep(10);
  33.     }
  34.     return 0;
  35. }

  36. static int create_threads(void)
  37. {
  38.     int i;
  39.     for(i=0 ; i < MAX_KTHREAD; i++)
  40.     {
  41.         struct task_struct *thread;
  42.         thread = kthread_run(thread_do, NULL, "thread-%d", i);
  43.         if(IS_ERR(thread))
  44.             return -1;

  45.         threads[i] = thread;
  46.     }
  47.     return 0;
  48. }

  49. static void cleanup_threads(void)
  50. {
  51.     int i;

  52.     for (i = 0; i < MAX_KTHREAD; i++)
  53.         if(threads[i])
  54.             kthread_stop(threads[i]);
  55. }

  56. static __init int minit(void)
  57. {
  58.     printk("call %s.\n",__FUNCTION__);
  59.     threads_lock_init();
  60.     if (create_threads())
  61.         goto err;
  62.     return 0;

  63. err:
  64.     cleanup_threads();
  65.     return -1;
  66. }

  67. static __exit void mfini(void)
  68. {
  69.     printk("call %s.\n",__FUNCTION__);
  70.     cleanup_threads();
  71.     show_my_data();
  72. }

  73. module_init(minit);
  74. module_exit(mfini); 
运行结果:

  1. chen@ubuntu:~/mygit/module/exam1$ dmesg
  2. [ 3475.623885] call minit.
  3. [ 3475.625348] run ...
  4. [ 3475.625363] run ...
  5. [ 3475.625375] run ...
  6. [ 3475.625386] run ...
  7. [ 3475.625397] run ...
  8. [ 3475.625546] run ...
  9. [ 3475.625562] run ...
  10. [ 3475.625574] run ...
  11. [ 3475.625594] run ...
  12. [ 3475.627184] run ...
  13. [ 3480.215762] call mfini.
  14. [ 3480.353601] count1 2899,count2 28990





<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(648) | 评论(0) | 转发(0) |
0

上一篇:3.18内核的sk_buff

下一篇:不可睡眠锁:RCU read-copy-updat

相关热门文章
  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • 什么是shell
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
原创粉丝点击