Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2229914
  • 博文数量: 505
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 2514
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-23 18:24
文章分类

全部博文(505)

文章存档

2019年(12)

2018年(15)

2017年(1)

2016年(17)

2015年(14)

2014年(93)

2013年(233)

2012年(108)

2011年(1)

2009年(11)

分类: LINUX

2014-09-22 19:42:56

网上找了下Linux进程间互斥的实现,两种方法,semaphore 和 文件锁。刚开始也尝试用semaphore来实现,但发现sem_wait和singal无法实现Windows下CirtSec,而采用了后者文件锁;

 

但对于读写锁来说实用文件锁实现,存在一定的不足,它分开了读写锁,而没有分开解读写锁,利用UnLock来统一解读写锁,对于这进程间读写锁的实现,还需要再进一步了解才可!

 

基于文件锁而实现的进程间互斥:


点击(此处)折叠或打开

  1. /*
  2.  * File: MProcessCritSec.h
  3.  * Author: root
  4.  *
  5.  * Created on 2010年5月13日, 上午4:37
  6.  */

  7. #ifndef _MPROCESSCRITSEC_H
  8. #define    _MPROCESSCRITSEC_H

  9. #include <fcntl.h>
  10. #include <string>

  11. using namespace std;

  12. class MProcessCritSec
  13. {
  14. public:
  15.     MProcessCritSec(char *pFileName);
  16.     virtual ~MProcessCritSec();

  17. public:
  18.     /*
  19.      *
  20.      */
  21.     bool Lock();

  22.     /*
  23.      * 解锁
  24.      */
  25.     bool UnLock();

  26.     /*
  27.      * 非阻塞锁
  28.      */
  29.     bool TryLock(int nWaitTime = 60);

  30.     /*
  31.      * 判断锁的状态
  32.      */
  33.     bool IsLock();

  34. private:
  35.     //
  36.     flock m_lock;
  37.     //
  38.     int m_nLockValue;
  39.     //
  40.     bool m_bLocked;
  41.     //
  42.     string m_strFilePath;
  43. };

  44. #endif    /* _MPROCESSCRITSEC_H */



  45. /*
  46.  * File: MProcessCritSec.cpp
  47.  * Author: root
  48.  *
  49.  * Created on 2010年5月13日, 上午4:37
  50.  */

  51. #include "MProcessCritSec.h"
  52. #include <errno.h>

  53. using namespace std;

  54. MProcessCritSec::MProcessCritSec(char *pFileName)
  55. :m_bLocked(false)
  56. {
  57.     m_bLocked = false;
  58.     m_strFilePath.append("/tmp/");
  59.     m_strFilePath.append(pFileName);

  60.     m_nLockValue = open(m_strFilePath.c_str(), O_WRONLY|O_CREAT, 0777);
  61. }

  62. MProcessCritSec::~MProcessCritSec()
  63. {
  64.     close(m_nLockValue);

  65.     remove(m_strFilePath.c_str());
  66. }

  67. /*
  68.  * 函数作用:锁
  69.  * 函数参数:
  70.  * 函数返回:
  71.  * bool
  72.  */
  73. bool MProcessCritSec::Lock()
  74. {
  75.     m_lock.l_type = F_WRLCK;
  76.     m_lock.l_whence = SEEK_SET;
  77.     m_lock.l_start = 0;
  78.     m_lock.l_len = 0;

  79.     if ( fcntl(m_nLockValue, F_SETLKW, &m_lock) != 0 )
  80.         return false;

  81.     m_bLocked = true;
  82.     
  83.     return true;
  84. }

  85. /*
  86.  * 函数作用:解锁
  87.  * 函数参数:
  88.  * 函数返回:
  89.  * bool
  90.  */
  91. bool MProcessCritSec::UnLock()
  92. {
  93.     m_lock.l_type = F_UNLCK;
  94.     m_lock.l_whence = SEEK_SET;
  95.     m_lock.l_start = 0;
  96.     m_lock.l_len = 0;


  97.     if ( fcntl(m_nLockValue, F_SETLKW, &m_lock) != 0 )
  98.         return false;

  99.     m_bLocked = false;
  100.     
  101.     return true;
  102. }

  103. /*
  104.  * 函数作用:尝试加锁
  105.  * 函数参数:
  106.  * nWaitTime : 尝试等待时间
  107.  * 函数返回:
  108.  * bool
  109.  */
  110. bool MProcessCritSec::TryLock(int nWaitTime)
  111. {

  112.     return false;
  113. }

  114. /*
  115.  * 函数作用:判断锁的状态
  116.  * 函数参数:
  117.  * 函数返回:
  118.  * bool : 锁状态
  119.  */
  120. bool MProcessCritSec::IsLock()
  121. {
  122.     return m_bLocked;
  123. }

阅读(1198) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~