不可睡眠锁:自旋锁spinlock编码学习
来源:互联网 发布:java数组二分查找 编辑:程序博客网 时间:2024/05/16 17:34
开源力量学习笔记
自旋锁(spinlock)简介
自旋锁是内核的一种同步机制,在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。
内核可以通过自旋锁占有某些资源,直到使用完后再释放锁。如果该资源已经被其他的任务占有了,那内核会不断等待,直到获得该资源。
这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。
自旋锁(spinlock)的基本形式API
初始化:
在编译时定义:DEFINE_SPINLOCK();
在运行时初始化:spin_lock_init();
持有锁和释放锁:
spin_lock();
//临界区
spin_unlock();
自旋锁代码编程示例:
运行结果:
自旋锁(spinlock)简介
自旋锁是内核的一种同步机制,在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。
内核可以通过自旋锁占有某些资源,直到使用完后再释放锁。如果该资源已经被其他的任务占有了,那内核会不断等待,直到获得该资源。
这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。
自旋锁(spinlock)的基本形式API
初始化:
在编译时定义:DEFINE_SPINLOCK();
在运行时初始化:spin_lock_init();
持有锁和释放锁:
spin_lock();
//临界区
spin_unlock();
自旋锁代码编程示例:
- #include <linux/module.h>
- #include <linux/kthread.h>
- #include <linux/delay.h>
- MODULE_LICENSE("GPL");
- MODULE_AUTHOR("Chen");
- MODULE_DESCRIPTION("The module is only used for test.");
- //static DEFINE_SPINLOCK(threads_lock);
- static spinlock_t threads_lock;
- static void threads_lock_init(void)
- {
- spin_lock_init(&threads_lock);
- }
- struct our_data{
- int count1;
- int count2;
- };
- static struct our_data my_data;
- static void show_my_data(void)
- {
- printk("count1 %d,count2 %d\n", my_data.count1, my_data.count2);
- }
- #define MAX_KTHREAD 10
- static struct task_struct *threads[MAX_KTHREAD];
- static int thread_do(void *data)
- {
- printk("run ...\n");
- while(!kthread_should_stop()){
- spin_lock(&threads_lock);
- my_data.count1++;
- my_data.count2 += 10;
- spin_unlock(&threads_lock);
- msleep(10);
- }
- return 0;
- }
- static int create_threads(void)
- {
- int i;
- for(i=0 ; i < MAX_KTHREAD; i++)
- {
- struct task_struct *thread;
- thread = kthread_run(thread_do, NULL, "thread-%d", i);
- if(IS_ERR(thread))
- return -1;
- threads[i] = thread;
- }
- return 0;
- }
- static void cleanup_threads(void)
- {
- int i;
- for (i = 0; i < MAX_KTHREAD; i++)
- if(threads[i])
- kthread_stop(threads[i]);
- }
- static __init int minit(void)
- {
- printk("call %s.\n",__FUNCTION__);
- threads_lock_init();
- if (create_threads())
- goto err;
- return 0;
- err:
- cleanup_threads();
- return -1;
- }
- static __exit void mfini(void)
- {
- printk("call %s.\n",__FUNCTION__);
- cleanup_threads();
- show_my_data();
- }
- module_init(minit);
- module_exit(mfini);
- chen@ubuntu:~/mygit/module/exam1$ dmesg
- [ 3475.623885] call minit.
- [ 3475.625348] run ...
- [ 3475.625363] run ...
- [ 3475.625375] run ...
- [ 3475.625386] run ...
- [ 3475.625397] run ...
- [ 3475.625546] run ...
- [ 3475.625562] run ...
- [ 3475.625574] run ...
- [ 3475.625594] run ...
- [ 3475.627184] run ...
- [ 3480.215762] call mfini.
- [ 3480.353601] count1 2899,count2 28990
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...
给主人留下些什么吧!~~
评论热议
0 0
- 不可睡眠锁:自旋锁spinlock编码学习
- 信号量与自旋锁 |Linux,信号量,自旋锁,睡眠锁,spinlock,semaphore
- 信号量与自旋锁 |Linux,信号量,自旋锁,睡眠锁,spinlock,semaphore 【转帖】
- 自旋锁spinlock
- 自旋锁 SpinLock
- 自旋锁spinlock
- 自旋锁 spinlock 理解
- 自旋锁(spinlock)
- Spinlock编程(自旋锁)
- 自旋锁(spinlock)
- 自旋锁spinlock
- 自旋锁spinlock
- 自旋锁(spinlock)
- spinlock自旋锁
- spinlock自旋锁
- 自旋锁(spinlock)
- 自旋锁spinlock
- Spinlock 自旋锁 备忘
- android编译环境配置总结
- linux应用编程学习(5)管道
- linux实用技巧:你该使用ctags查找源码了
- 内核模块下载和编译、安装
- 3.18内核的sk_buff
- 不可睡眠锁:自旋锁spinlock编码学习
- 8.可变对象(无序表和有序表——含java库中应用)
- LoRa笔记02 LoRa sx1276 sx1278的发射功率研究
- 不可睡眠锁:RCU read-copy-updat
- 可睡眠锁 互斥量、信号量、读写信号量、完成变量
- c++中使用Ctags
- 原子操作
- (一)洞悉linux下的Netfilter&iptables:什么是Netfilter?
- opencv2—(6)基于类的图像处理程序设计
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
qq实名没银行卡怎么办
qq电话没记录怎么办
交易猫充错qb了怎么办
微信话费充到空号里怎么办
退款退错了怎么办
cf充错了怎么办
红包没退回来怎么办
微信红包过期怎么办
扣扣发不了红包怎么办
红包24小时退还怎么办
qq红包没人领取怎么办
qq红包发错人了怎么办
有微信钱包没现金怎么办
qq红包卡包怎么办
qq红包单个限额怎么办
qq红包超额了怎么办
qq赚钱需要实名怎么办
微信领红包没有银行卡怎么办
皮包扣坏了怎么办
支付宝空间不足怎么办
钱包扣子掉了怎么办
iap支付验证失败怎么办
充值到移动副号怎么办
给副卡充了话费怎么办
qq消息加载失败怎么办
qq相册加载失败怎么办
手机登录不起qq怎么办
苹果自动扣钱怎么办
飞车支付发货失败怎么办
微众银行失效怎么办
支付宝转账钱没到账怎么办
别人要支付宝怎么办
电脑账号注销了怎么办
欠花呗500不还怎么办
花呗不能还款怎么办
建行银行卡到期了怎么办
支付宝订单上限怎么办
手机卡被回收了怎么办
账户支付已关闭怎么办
手机缴费交错号怎么办
学生作业平台登不上怎么办