Chinaunix首页 | 论坛 | 博客
  • 博客访问: 493790
  • 博文数量: 223
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2145
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-01 10:23
个人简介

该坚持的时候坚持,该妥协的时候妥协,该放弃的时候放弃

文章分类

全部博文(223)

文章存档

2017年(56)

2016年(118)

2015年(3)

2014年(46)

我的朋友

分类: LINUX

2014-12-03 22:14:51

开源力量学习笔记

自旋锁(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





阅读(1629) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~