读和写一般是怎么处理比较妥呢???

发布于 2022-10-15 04:56:15 字数 124 浏览 20 评论 0

现在做一个监控系统,需要读(采集下位机的数据)也需要写(通过触摸屏设置参数)。  这读和写一般是怎么处理比较好?我想一个线程里面一直循环读和写。另外一个线程处理读和写的标志位。  不知道有没有更好的办法???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

双手揣兜 2022-10-22 04:56:15

一个全局锁用于 每次操作为串行
TYPE_BLOCK
一个读锁,一个读增量
TYPE_RLOCK   
++r_lock;
一个写锁
TYPE_WLOCK

先使用全局锁或者使用原子锁取得CPU唯一执行权限,对数据锁位进行读写锁,读锁并增加读增量,释放全局锁或原子锁

读加锁:如果数据写锁标志有效,直接返回失败。   否则,自增读增量,防止读锁
读去锁:判断读增量个数,为0直接去掉读锁标志。  如果不为0  自减读增量,判断读增量是否为0,为0去掉读锁标志。
写加锁:判断写锁标志是否存在,存在返回失败。不存在,取得全局锁或原子锁,置放写锁标志,释放全局锁或原子锁,判断读锁标志是否存在,存在循环等待,并判断读增量是否等于0,如果等于0,去掉读锁标志,退出循环。最好加个超时等待。或者不采用循环等待,有读锁标志的时候直接返回失败!

细节部分自己去调整

苦笑流年记忆 2022-10-22 04:56:15
  1. char UserSrc::RLock(void**m_Packlist,  unsigned char m_Rid, unsigned long w_Time)
  2. {
  3.                  if( m_Packlist == NULL )
  4.                 {
  5.                                  return -1;
  6.                 }
  7.         while( (m_Packlist[m_Rid]->status & PACK_WLOCK) == PACK_WLOCK )
  8.         {               
  9.                 Sleep(10);
  10.                 --w_Time;
  11.         }
  12.         if( w_Time == 0 )
  13.         {
  14.                 return 0;
  15.         }
  16.         if( m_Packlist[m_Rid]->r_lock > 253 )
  17.         {
  18.                 return 0;
  19.         }
  20.     if( Lock() != 1 )
  21.         {
  22.             return 0;
  23.         }
  24.         ++m_Packlist[m_Rid]->r_lock;
  25.         m_Packlist[m_Rid]->status           |= PACK_RLOCK;
  26.     Unlock();
  27.         return 1;
  28. }
  29. char UserSrc::RUnlock(void**m_Packlist,  unsigned char m_Rid)
  30. {
  31.         if( m_Packlist == NULL )
  32.                 {
  33.                                  return -1;
  34.                 }
  35.     if( Lock() != 1 )
  36.         {
  37.             return 0;
  38.         }       
  39.         --m_Packlist[m_Rid]->r_lock;
  40.         if( m_Packlist[m_Rid]->r_lock== 0 )
  41.         {
  42.                 m_Packlist[m_Rid]->status       &= ~PACK_RLOCK;
  43.         }       
  44.     Unlock();
  45.         return 1;       
  46. }
  47. char UserSrc::WLock(void**m_Packlist,  unsigned char m_Rid, unsigned long w_Time)
  48. {
  49.         if( m_Packlist == NULL )
  50.                 {
  51.                                  return -1;
  52.                 }
  53.         if( (m_Packlist[m_Rid]->status & PACK_WLOCK) == PACK_WLOCK )
  54.         {
  55.                 return 0;
  56.         }
  57.     if( Lock() != 1 )
  58.         {
  59.             return 0;
  60.         }
  61.     m_Packlist[m_Rid]->status            |=  PACK_WLOCK;                                    //提前置放写标记,表明下一个步骤需要进行数据修改
  62.     Unlock();
  63.         while( (m_Packlist[m_Rid]->status & PACK_RLOCK) == PACK_RLOCK && m_Packlist[m_Rid]->r_lock != 0 )
  64.         {
  65.                          Sleep(1);
  66.                 --w_Time;
  67.         }
  68.         if( w_Time == 0 )
  69.         {
  70.                 m_Packlist[m_Rid]->status        &= ~PACK_WLOCK;
  71.                 return 0;
  72.         }
  73.         if( m_Packlist[m_Rid]->r_lock == 0 )
  74.         {
  75.                 m_Packlist[m_Rid]->status        &= ~PACK_RLOCK;
  76.         }
  77.         return 1;
  78. }
  79. char UserSrc::WUnlock(void**m_Packlist,  unsigned char m_Rid)
  80. {
  81.         if( m_Packlist == NULL )
  82.                 {
  83.                                  return -1;
  84.                 }
  85.     if( Lock() != 1 )
  86.         {
  87.             return 0;
  88.         }
  89.         m_Packlist[m_Rid]->status            &= ~PACK_WLOCK;
  90.     Unlock();
  91.         return 1;
  92. }

复制代码

夕色琉璃 2022-10-22 04:56:15

谢谢LS。研究中---

疯了 2022-10-22 04:56:15

忘了说   这个锁的调用是先进后出  后进先出原则  
而且临界区未保护,可能有执行上的问题,你调整代码吧

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文