1.涉及类

ACE_RW_Thread_Mutex //ACE读写锁
ACE_Read_Guard //ACE加读锁
ACE_Write_Guard //ACE加写锁
ACE_Thread_Manager //ACE线程管理

2.简介

ACE读/写锁
读/写锁与互斥体相类似。例如,获取读/写锁的线程也必须释放它。多个线程可同时获取一个读/写锁用于读,但只有一个线程可以获取该锁用于写。当互斥体保护的资源用于读远比用于写要频繁时,读/写互斥体有助于改善并发的执行。
ACE线程库提供了一个叫作ACE_RW_Mutex的类,在C++封装类中可移植地实现了读/写锁的语义。读/写锁将优先选择权给写。因而,如果有多个读和一个写在锁上等待,写将会首先获取它。

3.示例代码

 #include <iostream>
#include "ace/Thread_Manager.h"
#include "ace/Guard_T.h"
#include "ace/OS_NS_time.h" using namespace std;
ACE_RW_Thread_Mutex mutex; ACE_THR_FUNC_RETURN ThreadFunRead(void *arg)
{
ACE_thread_t threadId=ACE_Thread_Manager::instance()->thr_self(); ACE_Read_Guard<ACE_RW_Thread_Mutex> guard(mutex);
cout<<"Thread ReadLock begin NO:"<<threadId<<endl; //ACE_OS::sleep(4);
cout<<"Thread ReadLock end NO:"<<threadId<<endl;
return NULL;
}
ACE_THR_FUNC_RETURN ThreadFunWrite(void *arg)
{
ACE_thread_t threadId=ACE_Thread_Manager::instance()->thr_self(); ACE_Write_Guard<ACE_RW_Thread_Mutex> guard(mutex);
cout<<"Thread WriteLock begin NO:"<<threadId<<endl; ACE_OS::sleep();//休眠1s
cout<<"Thread WriteLock end NO:"<<threadId<<endl;
return NULL;
} int main(int argc, char *argv[])
{
//1000纳秒=1ms
timespec_t t;
t.tv_sec=;t.tv_nsec=; ACE_Thread_Manager* pThrMgr = ACE_Thread_Manager::instance();
//依次一读一写依次3个循环,结果显示是此读写锁写优先。即:加锁等待队列里写操作永远在读前面!
for(int i=;i<;i++)
{
pThrMgr->spawn((ACE_THR_FUNC)ThreadFunRead);
ACE_OS::nanosleep (&t);
pThrMgr->spawn((ACE_THR_FUNC)ThreadFunWrite);
ACE_OS::nanosleep (&t);
}
pThrMgr->wait(); return ;
}

RW_lock.cpp

4.示例运行结果

$ ./tt
Thread ReadLock begin NO:
Thread ReadLock end NO:
Thread WriteLock begin NO:
Thread WriteLock end NO:
Thread WriteLock begin NO:
Thread WriteLock end NO:
Thread WriteLock begin NO:
Thread WriteLock end NO:
Thread WriteLock begin NO:
Thread WriteLock end NO:
Thread ReadLock begin NO:
Thread ReadLock end NO:
Thread ReadLock begin NO:
Thread ReadLock end NO:
Thread ReadLock begin NO:
Thread ReadLock end NO:

执行结果

5.Makefile

#bin
THE_INCLUDE = -I./ \
-I${ACE_ROOT}/ THE_LIBPATH = -L./ \
-L${ACE_ROOT}/lib/
THE_LIB = -g -D_DEBUG_ -lACE# -lxti CFLAGS = ${THE_LIB} ${THE_INCLUDE} ${THE_LIBPATH}
CC=g++
SRC=$(wildcard *.cpp)
OBJ=$(addprefix ./, $(addsuffix .o, $(basename $(SRC))))
TARGET=tt
all: $(TARGET)
$(TARGET): $(SRC)
$(CC) -o $@ $^ $(CFLAGS)
@echo make all done
%.o: %.cpp
$(CC) $(CFLAGS) -o $@ -c $<
clean:
rm -f $(TARGET) $(OBJ)

Makefile

********************************************************************

高级线程(任务)ACE_Task_Base类来创建线程是更方便和优雅

6.示例代码

 #include <iostream>
#include "ace/Task.h" using namespace std; //静态锁
struct Resource
{
static ACE_RW_Thread_Mutex mutex;
};
ACE_RW_Thread_Mutex Resource::mutex; class ThreadFunRead : public ACE_Task_Base {
public:
virtual int svc()
{
ACE_Read_Guard<ACE_RW_Thread_Mutex> guard(Resource::mutex);
cout<<"Thread ReadLock begin NO:"<<ACE_Thread::self()<<endl; //ACE_OS::sleep(4);
cout<<"Thread ReadLock end NO:"<<ACE_Thread::self()<<endl;
return ;
}
}; class ThreadFunWrite : public ACE_Task_Base {
public:
virtual int svc()
{
ACE_Write_Guard<ACE_RW_Thread_Mutex> guard(Resource::mutex);
cout<<"Thread WriteLock begin NO:"<<ACE_Thread::self()<<endl; ACE_OS::sleep();//休眠1s
cout<<"Thread WriteLock end NO:"<<ACE_Thread::self()<<endl;
return ;
}
}; int main(int argc, char *argv[])
{
//1000纳秒=1ms
timespec_t t;
t.tv_sec=;t.tv_nsec=; ACE_Thread_Manager* pThrMgr = ACE_Thread_Manager::instance();
//依次一读一写依次3个循环,结果显示是此读写锁写优先。即:加锁等待队列里写操作永远在读前面!
for(int i=;i<;i++)
{
ThreadFunRead threadRead;
ThreadFunWrite threadWrite;
threadRead.activate();
ACE_OS::nanosleep (&t);
threadWrite.activate();
ACE_OS::nanosleep (&t);
} pThrMgr->wait(); return ;
}

RW_lock.cpp

ACE_linux:读写锁的更多相关文章

  1. 技术笔记:Delphi多线程应用读写锁

    在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前 ...

  2. java多线程-读写锁

    Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...

  3. 让C#轻松实现读写锁分离

    ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...

  4. C#读写锁ReaderWriterLockSlim的使用

    读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁.在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能. 某些场合下,对 ...

  5. 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁

    1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...

  6. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  7. 锁的封装 读写锁、lock

    最近由于项目上面建议使用读写锁,而去除常见的lock锁.然后就按照需求封装了下锁.以简化锁的使用.但是开发C#的童鞋都知道lock关键字用起太方便了,但是lock关键字不支持超时处理.很无奈,为了实现 ...

  8. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  9. 让C#轻松实现读写锁分离--封装ReaderWriterLockSlim

    ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...

随机推荐

  1. innodb_strict_mode=1

    从MySQL5.5.X版本开始,你可以开启InnoDB严格检查模式,尤其采用了页数据压缩功能后,最好是开启该功能.开启此功能后,当创建表(CREATE TABLE).更改表(ALTER TABLE)和 ...

  2. 5.6 太多分区引起OOM

    一个月之前,Scott和同事们发现公司有一个MySQL MHA集群的master(假设master机器名为hostA)每隔一周左右就会挂一次(指MySQL挂掉),在几周内,MHA来回切了好几次. 按照 ...

  3. 重现PHP Core的调用栈

        以前, 我曾经介绍过如何通过PHP的Core文件获取信息:如何调试PHP的Core之获取基本信息, 对于调用参数这块, 当时介绍的获取方法比较复杂. 于是今天我为PHP 5.4的.gdbini ...

  4. Tips: compilation and creating new projects on Android 4.0

    If you have downloaded android 4.0, you should read the article. $ANDROID_ROOT/tools/android.bat is ...

  5. DRM in Android

    我们Tieto公司的MM专家在<程序员>第8期上发表了一篇关于DRM的文章,请大家指教. DRM in Android DRM,英文全称为Digital Rights Management ...

  6. 文件夹添加右键DOS快捷入口

    1.自带的方法 win7: 按住shift键然后右键点击文件夹,菜单里会出现“在此处打开命令窗口”一项,其实就相当于在当前位置打开Dos窗口,这个是系统自带的. winxp: 打开“我的电脑”,点击菜 ...

  7. iOS之深入了解控制器View的加载

    前言 在面试中,面试官可能会问这样的问题,loadView有什么作用,它与viewDidLoad有何区别 首先我们得知道,控制器view是通过懒加载的方式进行加载的,即用到的时候再加载. loadVi ...

  8. git 版本控制系统初学

    Git -The stupid content tracker, 傻瓜内容跟踪器,是一个由Linux内核开发者Linus为了更好地管理Linux内核开发而创立的分布式版本控制软件. 1.建立本地git ...

  9. Linux操作系统的简单认识

    1:Linux操作系统的历史 Linux操作系统是由unix操作系统发展而来的,但是Unix是收费的系统,而Linux操作系统的免费的,开源的,所以使用比较广泛,但是它是基于命令行的,不提供图形化用户 ...

  10. 关于Eclipse平台的使用和开发第一个SWT程序

    IBM把投入巨资开发的Eclipse作为一个开源项目捐献给了开源组织Eclipse.org Eclipse出色而有独创的平台特性,现在仍由IBM子公司OTI(主要从事Eclipse开发的人)继续领导着 ...