在Linux平台上已经有现成的线程读写锁pthread_rwlock_t以及相关API,现将这些API封装成与Win32平台上相同的接口,以便于编写跨平台程序。这些API包括pthread_rwlock_init,pthread_rwlock_rdlock,pthread_rwlock_tryrdlock,pthread_rwlock_wrlock,pthread_rwlock_trywrlock,pthread_rwlock_unlock,pthread_rwlock_destroy,可在Linux在线手册上查阅它们的说明。下边的代码在VS2005中编辑,在Fedora

13虚拟机中编译,测试通过。

RWLockImpl.h view plain #ifndef _RWLockImpl_Header #define

_RWLockImpl_Header

#include #include #include #include

using namespace std;

//——class CRWLockImpl {

protected:CRWLockImpl();~CRWLockImpl();void ReadLockImpl();bool

TryReadLockImpl();void WriteLockImpl();bool TryWriteLockImpl();void

UnlockImpl();

private:pthread_rwlock_t m_rwl;};

//——

class CMyRWLock: private CRWLockImpl { public:

//创建读/写锁CMyRWLock(){};

//销毁读/写锁~CMyRWLock(){};

//获取读锁//如果其它一个线程占有写锁,则当前线程必须等待写锁被释放,才能对保护资源进行访问void

ReadLock();

//尝试获取一个读锁//如果获取成功,则立即返回true,否则当另一个线程占有写锁,则返回false bool

TryReadLock();

//获取写锁//如果一个或更多线程占有读锁,则必须等待所有锁被释放//如果相同的一个线程已经占有一个读锁或写锁,则返回结果不确定void

WriteLock();

//尝试获取一个写锁//如果获取成功,则立即返回true,否则当一个或更多其它线程占有读锁,返回false

//如果相同的一个线程已经占有一个读锁或写锁,则返回结果不确定bool TryWriteLock();

//释放一个读锁或写锁void Unlock();

private:CMyRWLock(const

CMyRWLock&);CMyRWLock& operator =

(const CMyRWLock&);};

inline void CMyRWLock::ReadLock()

{ ReadLockImpl();}

inline bool CMyRWLock::TryReadLock()

{ return TryReadLockImpl();}

inline void CMyRWLock::WriteLock()

{ WriteLockImpl();}

inline bool CMyRWLock::TryWriteLock()

{ return TryWriteLockImpl();}

inline void CMyRWLock::Unlock()

{ UnlockImpl();}

#endif RWLockImpl.cpp view plain #include "RWLockImpl.h"

CRWLockImpl::CRWLockImpl()

{ if (pthread_rwlock_init(&m_rwl, NULL))

cout<

reader/writer lock"<

CRWLockImpl::~CRWLockImpl()

{ pthread_rwlock_destroy(&m_rwl);}

void CRWLockImpl::ReadLockImpl()

{ if (pthread_rwlock_rdlock(&m_rwl))

cout<

lock"<

bool CRWLockImpl::TryReadLockImpl()

{ int rc = pthread_rwlock_tryrdlock(&m_rwl);if

(rc == 0)

return true;else if (rc == EBUSY)

return false;else cout<

lock reader/writer lock"<

return false;}

void CRWLockImpl::WriteLockImpl()

{ if (pthread_rwlock_wrlock(&m_rwl))

cout<

lock"<

bool CRWLockImpl::TryWriteLockImpl()

{ int rc = pthread_rwlock_trywrlock(&m_rwl);if

(rc == 0)

return true;else if (rc == EBUSY)

return false;else cout<

lock reader/writer lock"<

void CRWLockImpl::UnlockImpl()

{ if (pthread_rwlock_unlock(&m_rwl))

cout<

reader/writer lock"<

下边是测试代码view plain // pthread_rwlock.cpp : 定义控制台应用程序的入口点。

//

#include "RWLockImpl.h"

//创建一个读写锁对象CMyRWLock g_myRWLock;volatile int g_counter =

0;

//线程函数void * StartThread(void *pParam)

{ int lastCount = 0;for (int i = 0; i < 10000;

++i)

{ g_myRWLock.ReadLock();lastCount =

g_counter;//在读锁域,两个线程不断循环交替访问全局变量g_counter for (int k = 0; k

< 100; ++k)

{ if (g_counter != lastCount)

cout<

has been updated."<

g_myRWLock.WriteLock();//在写锁域,只有一个线程可以修改全局变量g_counter的值for

(int k = 0; k < 100; ++k)

{——g_counter;sleep(0);} for (int k = 0; k <

100; ++k)

{ ++g_counter;sleep(0);} ++g_counter;if (g_counter

<= lastCount)

cout<

error."<

return (void *)0;}

int main(int argc, char* argv[])

{ pthread_t thread1,thread2;pthread_attr_t attr1,attr2;

//创建两个工作线程pthread_attr_init(&attr1);pthread_attr_setdetachstate(&attr1,PTHREAD_CREATE_JOINABLE);if

(pthread_create(&thread1,&attr1,

StartThread,0) == -1)

{ cout<

failed"<

{ cout<

failed"<

//等待线程结束void

*result;pthread_join(thread1,&result);pthread_join(thread2,&result);

//关闭线程,释放资源pthread_attr_destroy(&attr1);pthread_attr_destroy(&attr2);

cout<

"<

int iWait;cin>>iWait;

return 0;}

编译,运行

运行结果与在Win32下用C++实现多线程读写锁的相同。

推介阅读:

c程序封装linux,Linux系统使用C语言封装线程读写锁相关推荐

  1. c语言设计体育打分程序,校运会成绩录入系统部分C语言源代码设计

    部分代码实例 界面 图4-1 分数统计系统程序主界面4.2模块(或子程序)1(标识符)源码 正文宋体小四号,正文段落和标题都是1.5倍行距,正文段落首行缩进2字符 这段程序的作用是检验输入的信息是否满 ...

  2. 基于微信小程序的短视频系统#毕业设计

    随着我国人民生活水平上不断的提高,人们在休息娱乐时很多时候回选择看一些视频来进行放松为此我开发了本动态视频网站.视频动态网站主要是为了实现广大爱好视频者而设计的,能够满足视频爱好者的大部分需求,在本系 ...

  3. 【黑马程序员新版Linux学习笔记】Linux系统实用操作命令——操作演示

    [黑马程序员新版Linux学习笔记]Linux 零基础快速入门: (一)Linux基本命令--操作演示 (二)Linux用户和权限 -- 操作演示 (三)Linux 小技巧快捷键 (四)Linux系统 ...

  4. qt creator:一款能够在windows/linux/mac系统上开发c程序的IDE

    qt creator:一款能够在windows/linux/mac系统上开发c程序的IDE 下面是下载地址:http://download.qt.io/official_releases/qtcrea ...

  5. linux嵌入式系统程序加密工具推荐:Virbox Protector.

    linux嵌入式系统程序加密工具推荐:Virbox Protector. 软件开发商 Virbox Protector是由北京深思数盾科技股份有限公司研发,2018年上市的一款加密工具. ARM-Li ...

  6. linux可以运行Windows程序吗,如何Linux系统上运行Windows应用程序(7)

    比较 下面是对运行于 Windows XP 上的和运行于 Red Hat 的 GNOME 中的消息框(Message Box)视觉上的对比: 对应于此的 C 代码(callDll.cpp 中第 60 ...

  7. linux/Windows系统如何安装PHP-openssl扩展

    今天倒腾了半天公司的OA办公系统,原来现在很多的smtp服务器是需要ssl方式加密的,而支持ssl需要php加载openssl扩展.所以本文我们将和大家一起分享如何在linux/Windows系统下安 ...

  8. 黑马程序员新版Linux零基础快速入门到精通——学习笔记

    01初识Linux 1.1.操作系统概述 1.1.1.硬件和软件 我们所熟知的计算机是由硬件和软件组成的. 硬件: 计算机系统中由电子.机械和光电元件等组成的各种物理装置的总称. ​ (看的见.摸得着 ...

  9. 【嵌入式Linux(基础篇)】嵌入式Linux底层系统开发流程和应用开发流程

    1.嵌入式Linux系统体系架构 一个完整的嵌入式Linux系统体系架构如图,大概可以分为三步: 硬件PCB板设计 底层系统开发 应用开发 2.硬件PCB设计流程 ① 获取所用芯片芯片手册: ② 建立 ...

最新文章

  1. 牛客~~打篮球~~~模拟水题
  2. fedora mysql默认密码忘记_Linux fedora 24 忘记密码图形化界面修改root密码的方法
  3. 基于协同过滤算法的在线鲜花店推荐系统详解及GitHub下载
  4. java timezone_Java TimeZone inDaylightTime()方法及示例
  5. C++ 高级数据类型(五)—— 数据结构
  6. 《痞子衡嵌入式半月刊》 第 2 期
  7. 地理空间数据可视分析综述笔记
  8. 樊登读书搞定读后感_樊登读书人生定位读后感
  9. 20210211 plecs diode rectifier 二极管整流电路 zero crossing 报错
  10. 计算机会计电算化与实训报告,会计电算化实训总结报告
  11. js实现60秒倒计时
  12. php 邮箱反垃圾机制,避开反垃圾邮件机制的qq邮件群发技巧
  13. 关于VA过期的解决办法
  14. 如何深入学习 Android Framework
  15. Oracle数据库练习2
  16. Educode--机器学习基础模型与算法测试闯关实验
  17. AJAX技术介绍(什么是AJAX?)
  18. 那些辉煌的背后, 不知装载了多少苦涩
  19. APE音质好还是FLAC音质好(转载)
  20. DC或者ICC工具check_library报错最直接简单解决方法

热门文章

  1. 由Linux内核bug引起SSH登录缓慢问题的排查与解决
  2. 杂谈:微服务的体系结构评审的三个问题
  3. Spring Cloud Stream消费失败后的处理策略(一):自动重试
  4. 从抖音关闭评论,看服务治理的重要性
  5. 控制cpu_设备管理 设备控制方式
  6. php 的ob start,php ob_start()函数详解
  7. 【并发编程】Atomic与CAS
  8. Yolo-FastestV2 移动端可达300FPS,参数量仅250k
  9. solvepnp.cpp:92: error: (-215:Assertion failed) ( (npoints = 4) || (npoints == 3
  10. pytorch CrossEntropyLoss测试