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 文件读写的例子

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...

  2. [React Native] Complete the Notes view

    In this final React Native lesson of the series we will finalize the Notes view component and squash ...

  3. Java连接redis的使用演示样例

    Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...

  4. 《RESTful Web Services》第二章 识别资源

    引言:开放RESTful Web服务的首要步骤之一是设计资源模型. 2.1 如何从领域名词中识别资源   2.2 如何选择资源粒度     一些因素会影响数据库表和对象模型的设计,例如领域建模.需要高 ...

  5. 傲娇Android二三事之操蛋的开发日记(第一回)

    武宗元年 十一月初四 霾 今日魔都,依旧仙雾环绕,仿佛蓬莱落凡尘.望着470这个鲜红的AQI修仙指数,贫道不禁吟道,“正是修仙好光景,雾霾时节又逢君”.但在这个只修bug,不修仙的时代,路上的行人都步 ...

  6. js jquery 等的地址

    jquery在线地址(jquery地址):http://code.jquery.com/jquery-latest.js js人脉图(关系图)插件: http://js.cytoscape.org/

  7. php关于日期时间 php日期 php时间

    strtotime 的牛逼用法: $a='-4 days '.date('Y-m-d');$day = date('Y-m-d', strtotime($a));var_dump($day); /** ...

  8. php代理请求

    $url = 'http://192.168.5.241:8893/index.php?a=SendMessage&m=taskSend'; $ci = curl_init ();/* Cur ...

  9. 【面试题】如何让C语言自动发现泄漏的内存

    1. 题目 改造malloc和free函数,使C语言能自动发现泄漏的内存,在程序退出时打印中遗漏的内存地址和大小. 2. 思路 用一个链表来记录已经分配的内存地址.在malloc时,把分配的内存地址和 ...

  10. Preparing for Different Databases

    Preparing for Different Databases In the previous chapter, we created a PostRepository that returns ...