用c++封装linux系统调用
#include <pthread.h>
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std; class RWLock { private :
pthread_mutex_t cnt_mutex;
pthread_cond_t rw_cond;
int rd_cnt, wr_cnt; RWLock(const RWLock&);
RWLock& operator= (const RWLock&); public :
RWLock(): rd_cnt(),wr_cnt()
{
pthread_mutex_init(&cnt_mutex, NULL);
pthread_cond_init(&rw_cond, NULL);
} void get_shared_lock()
{
pthread_mutex_lock(&cnt_mutex);
while (wr_cnt >)
{
pthread_cond_wait(&rw_cond,&cnt_mutex);
}
rd_cnt++;
pthread_mutex_unlock(&cnt_mutex);
} void release_shared_lock()
{
pthread_mutex_lock(&cnt_mutex);
rd_cnt--;
if ( == rd_cnt)
{
pthread_cond_signal(&rw_cond);
}
pthread_mutex_unlock(&cnt_mutex);
} void get_exclusive_lock()
{
pthread_mutex_lock(&cnt_mutex);
while (rd_cnt+wr_cnt>)
{
pthread_cond_wait(&rw_cond,&cnt_mutex);
}
wr_cnt++;
pthread_mutex_unlock(&cnt_mutex);
} void release_exclusive_lock()
{
pthread_mutex_lock(&cnt_mutex);
wr_cnt--;
pthread_cond_broadcast(&rw_cond);
pthread_mutex_unlock(&cnt_mutex);
} ~RWLock()
{
pthread_mutex_destroy(&cnt_mutex);
pthread_cond_destroy(&rw_cond);
}
}; class Test
{ private :
RWLock lock; static void* shared_task_handler(void* arg)
{
Test* testptr = static_cast<Test*>(arg); testptr->lock.get_shared_lock();//得到共享锁
//do the shared task here
testptr->lock.release_shared_lock();
} static void * exclusive_task_handler(void * arg)
{
Test* testptr = static_cast<Test*>(arg);
testptr->lock.get_exclusive_lock();
//do the exclusive task here
testptr->lock.release_exclusive_lock();
} public :
typedef void* (*ThreadFunc) (void*); void start()
{
srand(time(NULL)); const int THREADS_NO=rand()%;
pthread_t* threads = new pthread_t[THREADS_NO]; for(int i=; i<THREADS_NO; i++)
{
ThreadFunc tmpfunc = rand()%? shared_task_handler : exclusive_task_handler;
if (pthread_create(threads+i,NULL,tmpfunc,this))
{
cerr << "pthread_create fails" << endl;
exit();
}
} for(int i=; i<THREADS_NO; i++)
{
pthread_join(threads[i],NULL);
} delete[] threads;
}
}; int main()
{
Test tmptest;
tmptest.start();
}
static_cast < type-id > ( expression )
int i;
float f = 166.71;
i = static_cast<int>(f);
此时结果,i的值为166。
cstdlib是C++里面的一个常用函数库, 等价于C中的<stdlib.h>。
http://blog.chinaunix.net/uid-52437-id-2108727.html
用c++封装linux系统调用的更多相关文章
- 别出心裁的Linux系统调用学习法
别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...
- 关于Linux系统调用,内核函数【转】
转自:http://blog.csdn.net/ubuntulover/article/details/5988220 早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么.当时突然想 ...
- Linux系统调用(转载)
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- linux内核剖析(六)Linux系统调用详解(实现机制分析)
本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...
- Linux系统调用、新增系统调用方法【转】
转自:http://blog.chinaunix.net/uid-25374603-id-3401045.html 说明: 系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源, ...
- 理解Linux系统调用
目录 1.什么是系统调用 2.linux的系统调用 3.linux系统调用实现 1.什么是系统调用 系统调用,指的是操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的 ...
- ARM Linux系统调用的原理
转载自:http://blog.csdn.net/hongjiujing/article/details/6831192 ARM Linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交 ...
- Linux系统调用及其效率
操作系统相关概念: 操作系统---管理计算机硬件与软件资源的软件,是用户与系统操作交互的接口,为在它上面运行的程序提供服务. 操作系统内核 ----操作系统的核心.负责管理系统的进程.内核.设备驱动程 ...
- Linux系统调用过程分析
參考: <Linux内核设计与实现> 0 摘要 linux的系统调用过程: 层次例如以下: 用户程序------>C库(即API):INT 0x80 ----->system_ ...
随机推荐
- JavaWeb学习笔记:ServletConfig()和ServletContext()
ServletConfig()和ServletContext() 1.ServletConfig() ServletConfig是一个接口,它由server提供商来实现. ServletConfig封 ...
- Java GC、新生代、老年代
堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象.在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( ...
- List、Set、Map、数组之间各种转换
刚学Java不久的时候,接到一个电面,然后问了一些java的知识,比如说Java的编码,Unicode等,但是最让我蛋疼的是怎么吗map转为set,那个时候对集合用的很少,对集合不是特别了解,map还 ...
- 转:Android应用开发性能优化完全分析
转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜 ...
- 微信小程序-自定义组件
自定义一个swiper轮播. index index.wxml <!--logs.wxml--> <swiperBanner Height="450rpx" im ...
- openerp domain 規則
oe中的domain多用于自定义搜索条件. domain中的单个条件是一个三个元素组成的元组.第一个是对象的一个column,也就是字段名:第二个是比较运算符``=, !=, & gt;, & ...
- iOS开发:icon和启动图尺寸(转)
转至:http://www.cnblogs.com/shaoting/p/4941634.html 歪果仁的总结: Asset iPhone 6s Plus and iPhone 6 Plus (@3 ...
- EF--Code First配置问题
用EntityFramework Reverse POCO Generator工具生成的连接:<add name="Base_dbContext" connectionStr ...
- 浏览器HTTP请求分析
普通网民打开网页,访问网站,并不需要了解所谓HTTP协议.作为软件工程师,了解一下浏览器的工作过程还是一件比较有意思的事情.我向大家介绍一下当我们在浏览器的地址栏里面回车的时候,浏览器如何和Web服务 ...
- mosquitto---config.mk
mosquitto安装时在解压压缩包后生成的文件夹中我们可以找到mosquitto主要配置文件config.mk 这个文件的主要内容: # 是否支持tcpd/libwrap功能. #WITH_WRAP ...