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. Android蓝牙操作笔记

    蓝牙是一种支持设备短距离传输数据的无线技术.android在2.0以后提供了这方面的支持. 从查找蓝牙设备到能够相互通信要经过几个基本步骤(本机做为服务器): 1.设置权限 在manifest中配置 ...

  2. iOS开发——高级技术&生成二维码

      生成二维码 因为项目里需要新增个功能,该功能用到了二维码技术.于是我便查阅了资料,先学习了二维码的生成. 我们使用libqrencode库来生成二维码.下载地址http://download.cs ...

  3. c++ 怎样获取系统时间

    c++ 怎样获取系统时间 2008-04-28 15:34 //方案— 长处:仅使用C标准库:缺点:仅仅能精确到秒级 #include <time.h> #include <stdi ...

  4. [Effective C++ --018]让接口容易被正确使用,不易被误用

    □第一节 什么是接口?什么是接口?百度百科的解释:两个不同系统(或子程序)交接并通过它彼此作用的部分.接口的概念贯穿于整个软件开发过程中,本文讨论的接口概念仅局限于以C++实现的class,funct ...

  5. 动态修改 C 语言函数的实现

    Objective-C 作为基于 Runtime 的语言,它有非常强大的动态特性,可以在运行期间自省.进行方法调剂.为类增加属性.修改消息转发链路,在代码运行期间通过 Runtime 几乎可以修改 O ...

  6. 【转】ubuntu修改IP地址和网关的方法

    一.使用命令设置Ubuntu IP地址 1.修改配置文件blacklist.conf禁用IPV6 sudo vi /etc/modprobe.d/blacklist.conf 表示用vi编辑器(也可以 ...

  7. oracle中对LONG列进行查询

    SQL> CREATE TABLE T_LONG (ID NUMBER, LONG_COL LONG); 表已创建. SQL> INSERT INTO T_LONG VALUES (1, ...

  8. a链接中关于this的使用

    a连接点击事件用 this 时,要用 onclick='click(this)',href='javascript:void()' a连接无法使用,要看看是不是自动变成ie7或者更低

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

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

  10. SICP的一些练习题

    1.3 较大两个数之和 (define (MaxSum x y z) (+ (cond ((or (> x y) (> x z)) x) ()) (cond ((or (> y x) ...