qiangqiang02 发表于 2009-11-02 13:23

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 ;
   }

qiangqiang02 发表于 2009-11-02 15:28

没人回答吗?

llzzccc 发表于 2009-11-02 22:08

如果function B 再spinlock,会死的。

fantry_t 发表于 2009-11-05 00:16

回复 #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 编辑 ]

qiangqiang02 发表于 2009-11-06 13:42

回复 #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() ;
}

ccaaatt 发表于 2009-11-08 09:49

胡说一把

谁加锁有个约定就好吧
不一定那么绝对

如果C的编译器能用像JAVA的annotation一样的机制,控制编译器如何做静态检查就爽了


不过这里的有位编译器高手好像很蔑视java

qiangqiang02 发表于 2009-11-09 14:59

希望大家能继续解答我的问题,现在还未得到较为全面的答案
页: [1]
查看完整版本: spinlock 的问题