spinlock 的问题
大家好,问个 spin_lock 的问题。在我的 Driver 里面存在一个全局变量 global_A
为了保证数据的一致,所以采用互斥操作,在访问 global_A 时,我会进行“加锁” 与 “解锁”操作,采用 spin_lock_irqsave 与 spin_unlock_irqrestore
有这样一种情况:
func_B()
{
// 对全局变量进行操作(读或写) 问题:func_B 只有 func_A 来调用,那么 fun_B 中应该不用 lock 与 unlock 操作了吧?
}
func_A()
{
spin_lock_irqsave ;
// 对全局变量进行一些操作
func_B() ; --> 调用 func_B
spin_unlock_irqrestore ;
} 没人回答吗? 如果function B 再spinlock,会死的。
回复 #1 qiangqiang02 的帖子
spin_lock_irqsave这个函数杀伤力很大,如果不是在中断上半部来处理这个全局变量,就没有必要用这个函数。题外话。
你说的这个问题,典型的是设计不合理
functionA根本就没有必要知道functionB是如何处理这个全局变量的,(权责明确),所以functionB要处理全局变量的话,必须自己加锁,否则哪天functionB被其他函数条用了,而那个函数正好又没有负责加锁,那么就会出错了。
所以functionA只要保证自己处理对这个全局变量就好了,functionB也自己处理就对了。
设计如下:
func_A()
{
spin_lock_irqsave ;
// 对全局变量进行一些操作
spin_unlock_irqrestore ;
func_B() ; --> 调用 func_B
}
func_B()
{
。。。。。。。。。
spin_lock_irqsave ;
// 对全局变量进行一些操作
spin_unlock_irqrestore ;
。。。。。。。。。
}
[ 本帖最后由 fantry_t 于 2009-11-5 00:19 编辑 ]
回复 #4 fantry_t 的帖子
楼上的建议很好,我这样涉及的思路的确很不清晰,乱七八糟的感觉。但是,当存在这样的需求时,您又该如何设计?
fun_A()
{
// 执行自己的事情1
// 调用 fun_B
// 执行自己的事情2
}
fun_B()
{
}
请问这个时候又该如何加锁?
总不能这样吧:
fun_A()
{
lock() ;
// 执行事情1
unlock
fun_B() ;
lock() ;
// 执行事情2
unlock() ;
}
fun-B()
{
lock() ;
// B 做的事情
unlock() ;
}
胡说一把
谁加锁有个约定就好吧不一定那么绝对
如果C的编译器能用像JAVA的annotation一样的机制,控制编译器如何做静态检查就爽了
不过这里的有位编译器高手好像很蔑视java 希望大家能继续解答我的问题,现在还未得到较为全面的答案
页:
[1]