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. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  2. Nginx+Tomcat动静态资源分离

    1 创建用户.用户组 useradd -g users www passwd www //设置密码,否则该用户不可用 groupadd -g 888 www //创建用户组 gpasswd -a ww ...

  3. [Effective C++ --021]必须返回对象时,别妄想返回其reference

    引言 在条目20中,我们知道了值传递和引用传递的效率问题,因此在设计程序时,我们可能就尽可能来返回引用而不是值. 可是,可能会犯下面的一些错误:传递一些引用指向其实并不存在的对象. 第一节:返回临时变 ...

  4. How to Tune Java Garbage Collection--reference

    reference:http://architects.dzone.com/articles/how-tune-java-garbage The Performance Zone is support ...

  5. 如何获取SQL Server数据库元数据的方法

    发布时间:2007.06.15 05:05    来源:赛迪网    作者:3946469 元数据简介 元数据 (metadata) 最常见的定义为“有关数据的结构数据”,或者再简单一点就是“关于数据 ...

  6. css实现响应式全屏背景

    利用css中 background-size:cover  填充整个viewport 注意: 一张背景图像素5000px*5000px在pc端 缩放都基本满足要求 不会出现模糊失真: 但是在移动端使用 ...

  7. c++ (P49—P68)

    1 c++语言并没有明确规定调用这个函数时实参的求值顺序,而是让编译器根据对代码进行优化的需要自行决定实参的求职顺序.这样就带来了二义性. function(a++,a*); //存在二义性 a++; ...

  8. div 块跟随 鼠标点击

    js: $(document).ready(function () { $(".company-contact ul li").click(function (ev) {      ...

  9. 【Objective-C】4-空指针和野指针

    一.什么是空指针和野指针 1.空指针 1> 没有存储任何内存地址的指针就称为空指针(NULL指针) 2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0. 下面两个都是空指针 ...

  10. 简单的ROT13码编码与解码

    ROT13码意思是将字母左移13位.如'A' ↔ 'N', 'B' ↔ 'O','V' ↔ 'I'. 下面实现ROT13码的解码. function rot13(str) { var arr = [] ...