ACE_linux:读写锁
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:读写锁的更多相关文章
- 技术笔记:Delphi多线程应用读写锁
在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前 ...
- java多线程-读写锁
Java5 在 java.util.concurrent 包中已经包含了读写锁.尽管如此,我们还是应该了解其实现背后的原理. 读/写锁的 Java 实现(Read / Write Lock Java ...
- 让C#轻松实现读写锁分离
ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...
- C#读写锁ReaderWriterLockSlim的使用
读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁.在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能. 某些场合下,对 ...
- 可重入锁 公平锁 读写锁、CLH队列、CLH队列锁、自旋锁、排队自旋锁、MCS锁、CLH锁
1.可重入锁 如果锁具备可重入性,则称作为可重入锁. ========================================== (转)可重入和不可重入 2011-10-04 21:38 这 ...
- 用读写锁三句代码解决多线程并发写入文件 z
C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...
- 锁的封装 读写锁、lock
最近由于项目上面建议使用读写锁,而去除常见的lock锁.然后就按照需求封装了下锁.以简化锁的使用.但是开发C#的童鞋都知道lock关键字用起太方便了,但是lock关键字不支持超时处理.很无奈,为了实现 ...
- Java多线程13:读写锁和两种同步方式的对比
读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...
- 让C#轻松实现读写锁分离--封装ReaderWriterLockSlim
ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...
随机推荐
- 匿名内部类new Runnable()
匿名内部类(Anonymous Inner Class),在创建实例的同时给出类的定义,所有这些在一个表达式中完成. Java code? 1 2 3 4 Runnable rn = new Runn ...
- zookeeper配置同步zookeeper编程
分布式助手Zookeeper(四) kissyoudyb 2013-12-05 17:41 阅读:33 评论:0 分布式助手Zookeeper(三) kissyoudyb 2013-12-05 ...
- android131 360 05 手势触摸滑动,sim卡,开机启动的广播,手机联系人,SharedPreferences,拦截短信
安卓手势触摸滑动: package com.itheima52.mobilesafe.activity; import android.app.Activity; import android.con ...
- [原创]javascript prototype 对象 函数 <精简的美丽......>
精简的美丽...... javascript prototype 对象 函数 在javascript中我们都知道创建一个对象使用如下代码var x = {}对象可以拥有属性和方法var x = { ...
- android开发问题汇总
android开发问题汇总 一. 无法创建新android项目 在eclipse创建新项目时出现: this template depends on the android support libra ...
- javascript调试 console
Console命令详解,让调试js代码变得更简单 Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些 ...
- linux文件 编辑常用 inux手把手vi ---针对文件操作
命令语法 说明 使用频率(1:常用;2一般:3:偶尔) 1.VI编辑器的启动与退出 VI编辑器的启动与退出 vi file1 新建一个文本文件名为file1 :q 退出,如果对缓存去进行过修改,则提 ...
- java_类泛型基本实例
package ming; public class Apple2<T> { public T info; public Apple2(T info) { this.info = info ...
- eclipse git插件配置
一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到对应的 EGit插件,无法安装) E ...
- MySQL(6):数据操作
1.创建数据(插入数据) (1)insert into tab_name(字段列表) values(值列表) (2)如果需要在插入时,为所有的字段设置值,那么可以省略字段列表.要求是值的顺序,应该 ...