免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7980 | 回复: 18
打印 上一主题 下一主题

自旋锁的疑问-spin_lock_irqsave -线程调度机制也被禁止? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-06 10:48 |只看该作者 |倒序浏览
spin_lock_irqsave   -------该宏如果获得自旋锁lock,它也将保存标志寄存器的值到变量flags中,并且失效本地中断,--------
-------本地中断失效??,是不是线程调度机制也被禁止了??

我写了个测试的驱动


case IOCTL_CMD_CLOSE:
{
spin_lock_irqsave (&test_lock, flags);
printk("i am pthread close lock%d\n",arg);
break;
}
case IOCTL_CMD_OPEN:
{
printk("i am pthread open lock %d\n",arg);
spin_unlock_irqrestore (&test_lock, flags);
break;
}


应用是
for (i=0;i<5;i++)
{
err = pthread_create(&tid, NULL,spin_test,(void *)i);
if(err != 0){
printf("can't create thread: %d\n",i);
return 0;
        }

线程里面是
ioctl(fd,IOCTL_CMD_CLOSE,j);
sleep(4-i);
ioctl(fd,IOCTL_CMD_OPEN,j);


结果是
OPEN: major=233, minor=1
i am pthread close lock0
i am pthread close lock1
i am pthread close lock2
i am pthread close lock3
i am pthread close lock4
i am pthread open lock 4
i am pthread open lock 3
i am pthread open lock 2
i am pthread open lock 1
i am pthread open lock 0
CLOSE: major=233, minor=1
   结论是:发现为什么lock0 ,没有解锁时候,   lock1 马上就上锁了! 不是lock1要自旋吗?lock2.3.4也是






case IOCTL_CMD_CLOSE:
                        {
                                spin_lock_irqsave (&test_lock, flags);
                                local_irq_disable();
                                printk("lock is :%d\n",   spin_is_locked(&test_lock));   

                                printk("i am pthread%d  lock\n",arg);
                                count++;
                                printk("count= %d\n",count);
                        break;
                        }
                case IOCTL_CMD_OPEN:
                        {        
                                printk("count= %d\n",count);
                                printk("i am pthread%d unlock \n",arg);
                                spin_unlock_irqrestore (&test_lock, flags);
                                local_irq_enable();
                                count--;                        
                                printk("lock is :%d\n",   spin_is_locked(&test_lock));   
                                break;
                        }

结果OPEN: major=233, minor=1
lock is :0
i am pthread0  lock
count= 1
lock is :0
i am pthread1  lock
count= 2
lock is :0
i am pthread2  lock
count= 3
lock is :0
i am pthread3  lock
count= 4
lock is :0
i am pthread4  lock


结论:看来spinlock没有编译,,但是local_irq_enable();了  怎么线程调度还有呢??奇怪-----------------

[ 本帖最后由 xiaochangfu 于 2009-11-9 15:14 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-06 10:49 |只看该作者

回复 #1 xiaochangfu 的帖子

在线等大侠  跪谢了!!

论坛徽章:
0
3 [报告]
发表于 2009-11-06 10:54 |只看该作者
说明下  这是在但cpu下面的,我只是想用irqsave--本地中断失效这个功能

论坛徽章:
0
4 [报告]
发表于 2009-11-07 08:56 |只看该作者
太简单了吗??

论坛徽章:
0
5 [报告]
发表于 2009-11-07 11:31 |只看该作者
看了下资料~ 貌似单处理器上的自旋锁貌似都是空操作~

LZ可以追一下你的汇编代码,看看spin_lock_irqsave是否为空~

论坛徽章:
0
6 [报告]
发表于 2009-11-07 11:48 |只看该作者
先看是单处理器还是多处理器。
那个输出结果看上去是不正常。看看是否自己程序其他地方有问题。

论坛徽章:
0
7 [报告]
发表于 2009-11-07 20:28 |只看该作者

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2009-11-07 22:28 |只看该作者
调用spin_lock_irqsave将关闭本地中断,而Linux中的线程,为轻量级进程。中断关闭了,就无法进行进程调度了

论坛徽章:
0
9 [报告]
发表于 2009-11-09 14:35 |只看该作者

回复 #5 superfight 的帖子

是这样的,单cpu是空操作,,通过什么判断呢!追汇编 还不会!
spin  只对smp和可抢占的up起作用,可是2.6.8的内核是抢占的(网上看的),,也不知道用什么方法可以具体看下是不是真的抢占!!


谢谢了

论坛徽章:
0
10 [报告]
发表于 2009-11-09 14:36 |只看该作者
原帖由 superfight 于 2009-11-7 11:31 发表
看了下资料~ 貌似单处理器上的自旋锁貌似都是空操作~

LZ可以追一下你的汇编代码,看看spin_lock_irqsave是否为空~




是这样的,单cpu是空操作,,通过什么判断呢!追汇编 还不会!
spin  只对smp和可抢占的up起作用,可是2.6.8的内核是抢占的(网上看的),,也不知道用什么方法可以具体看下是不是真的抢占!!


谢谢了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP