上层app多线程操作驱动模块

      上层app多线程操作驱动时驱动的一些改动

 

 

第一个就是现在上层应用去多线程操作驱动时会失败,这是由于驱动层互斥的问题,换句话说,驱动要去支持上层应用的多线程操作,则驱动中要加相应的互斥锁。 
第二个就是多线程操作时,会牵扯到全局数据的不同进程进程操作。这样就要对open和release函数进行改动,因为每个线程都会去open和close节点,此时必定会调用open和release函数,如果release中做了一些对全局变量或者标志的撤销或改变,那就要注意了。 
假设有A,B两个线程去open和close节点,两个是并行的去访问,此时A线程早于B线程close的节点,那么也将通过release函数改变了一些全局的变量资源,但此时B线程还在操作这个在使用这写全局资源,这样就会导致B线程出问题, 
为了避免这些问题,可以做一个计数器来保证open和release的动作是一致的,即只有最后一个线程close节点时调用release执行时才让其撤销所有的全局资源。即每open一次,全局计数器flag++,每close一次flag--,当release检测到flag = 0时即可执行真正的撤销动作。 
eg:

 
  1. static RET_CODE dev_open(struct inode *inode, struct file *file)
  2. {
  3. UINT8 dev_idx = 0;
  4.  
  5. dev_idx = MINOR(inode->i_rdev);
  6. if(dev_idx >= MAX_TUNER_SUPPORT_NUM)
  7.    PRINTF(LOG_DBG,"[%s]line=%d,dev_idx set error!\n", __FUNCTION__, __LINE__);
  8. return ERR_FAILED;
  9. }
  10. my_dev_priv[dev_idx]->dev_used++;//使用计数器记录open次数
  11. file->private_data = (void *)&my_dev[dev_idx];
  12. return RET_SUCCESS;
  13. }

-------------------------------------------------------------------------------------------------------------------------------

  1. RET_CODE dev_release(struct inode *inode, struct file *file)
  2. {
  3.     struct my_device *dev = file->private_data;
  4.     struct my_private *priv = dev->priv;
  5.  
  6.     priv->nim_used--;//每调用一次close即flag--,然后检测是否是最后一次close,若不是直接退出,若是,执行真正的注销动作
  7.     if(priv->dev_used)
  8.         return RET_SUCCESS;
  9.  
  10.     if (priv->opened && priv->dev_close)
  11.     {
  12.         priv->dev_close();
  13.     }  
  14.     dev_ctrl(dev, DEMOD_CTRL_0X90);
  15.     dev_set_acq_workmode(dev, OPTR_HW_CLOSE);
  16.  
  17.     //g_work_alive = 0;
  18.     priv->work_alive = 0;
  19.     if (dev->work_queue)
  20.     {
  21.         flush_workqueue(dev->work_queue);
  22.         destroy_workqueue(dev->work_queue);
  23.         dev->work_queue = NULL;
  24.     }
  25.  
  26.     if (dev->workqueue)
  27.     {
  28.         flush_workqueue(dev->workqueue);
  29.         destroy_workqueue(dev->workqueue);
  30.         dev->workqueue = NULL;
  31. }
  1.     priv->dev_init = FALSE;
  2.     return RET_SUCCESS;
  3. }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值