Boost 读写锁
//#########测试多线程,读写锁,递归锁
#include <boost/thread.hpp>
#include <boost/thread/recursive_mutex.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/progress.hpp>
#include <boost/interprocess/detail/atomic.hpp>
#include <list>
#include <string>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <stdint.h>
#define THREAD_COUNT 100
typedef boost::mutex Uni_Mutex;
typedef boost::shared_mutex WR_Mutex;
typedef boost::unique_lock<WR_Mutex> writeLock;
typedef boost::shared_lock<WR_Mutex> readLock;
typedef boost::recursive_mutex Rcs_Mutex;
typedef boost::unique_lock<Rcs_Mutex> recuLock;
class Queue
{
public:
Queue(){};
~Queue(){};
void write(int value)
{
writeLock lockWrite(m_rwMutex);
m_list.push_back(value);
std::cout<<"write! now size is "<<size()<<" Thread id is "<<boost::this_thread::get_id()<<std::endl;
}
int read(int pos)
{
readLock lockRead(m_rwMutex);
if(size()==0 || pos>=size())
return -1;
std::list<int>::iterator itr = m_list.begin();
std::advance(itr , pos);
int value = *itr;
std::cout<<"read! now size is "<<size()<<" Thread id is "<<boost::this_thread::get_id()<<std::endl;
return value;
}
void remove(int pos)
{
writeLock lockWrite(m_rwMutex);
if(size()==0 || pos>=size())
return;
std::list<int>::iterator itr = m_list.begin();
std::advance(itr , pos);
m_list.erase(itr);
std::cout<<"remove! size is "<<size()<<" Thread id is "<<boost::this_thread::get_id()<<std::endl;
}
int size()
{
recuLock lock(m_sizeMutex);
return m_list.size();
}
private:
std::list<int> m_list;
Rcs_Mutex m_sizeMutex;
WR_Mutex m_rwMutex;
};
Queue queue;
volatile uint32_t count = 0;
typedef boost::shared_ptr<boost::thread> Thread;
Thread thread_array[THREAD_COUNT];
void increase_count()
{
boost::interprocess::detail::atomic_inc32(&count);
}
void testdata()
{
boost::this_thread::at_thread_exit(increase_count);
for(int i=0;i<10;i++)
{
queue.read(i);
if(i%4==0)
queue.write(i);
if(i%2==0)
queue.remove(i);
}
std::cout<<"Thread "<<boost::this_thread::get_id()<<" exit"<<std::endl;
}
int main(int argc , char* argv[])
{
boost::progress_timer t;
for(int i=0;i<10;i++)
queue.write(i);
std::cout<<"-----------thread create-----------"<<std::endl;
for(int i=0;i<THREAD_COUNT;++i)
{
thread_array[i].reset(new boost::thread(testdata));
}
while(1)
{
if(count>=THREAD_COUNT)
return 0;
}
}
Boost 读写锁的更多相关文章
- linux kernel RCU 以及读写锁
信号量有一个很明显的缺点,没有区分临界区的读写属性,读写锁允许多个线程进程并发的访问临界区,但是写访问只限于一个线程,在多处理器系统中允许多个读者访问共享资源,但是写者有排他性,读写锁的特性如下:允许 ...
- 技术笔记: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后面的任务 ...
随机推荐
- python中的标识符长度能有多长
在python中,标识符可以还是任意长度.此外,我们在命名标识符时还必须遵守以下规则 1 只能以下划线或者A-Z/a-z中字母开头 2 其余部分可以使用A-Z/a-z/0-9 3 区分大小写 4 关键 ...
- Ubuntu16.04下编译android6.0源码
http://blog.csdn.net/cnliwy/article/details/52189349 作为一名合格的android开发人员,怎么能不会编译android源码呢!一定要来一次说编译就 ...
- 嵌入式boa服务器移植
开发板:EDUKIT-III实验箱,S3C2410+LINUX2.4,实验箱随箱光盘提供的Zimage,nor flash启动. 主机:ubnutn10.4LTS,arm-linux-gcc 2.95 ...
- 一个骑行者的独白,很不错,我就转载了。--原名是--<<关于认怂这件事>>
一个骑行者的独白,很不错,我就转载了.--原名是--<<关于认怂这件事>> PS:我不知道这些是对是错,但都不曾后悔,或许哪天我在生活面前也怂了,然后跑回大城市乖乖的当个小 ...
- 跨平台移动开发_PhoneGap 使用Accelerometer 加速器
使用Accelerometer 加速器效果图 示例代码 <!DOCTYPE html> <html> <head> <title> Cude Phone ...
- 写给后端程序员的HTTP缓存原理介绍--怎样决定一个资源的Cache-Control策略呢
通过Internet获取资源既缓慢,成本又高.为此,Http协议里包含了控制缓存的部分,以使Http客户端可以缓存和重用以前获 取的资源,从而优化性能,提升体验.虽然Http中关于缓存控制的部分,随着 ...
- CSS3 3D旋转按钮对话框
在线演示 本地下载
- Kubernetes Ingress
Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定node主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是 Service可能有很多个,如果每个都绑定一个 ...
- 查看SELinux状态
查看SELinux状态:1./usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 2.getenforce ##也可以用这个命令检查 关闭S ...
- DataX-HDFS(读写)
DataX操作HDFS 读取HDFS 1 快速介绍 HdfsReader提供了读取分布式文件系统数据存储的能力.在底层实现上,HdfsReader获取分布式文件系统上文件的数据,并转换为DataX传输 ...