#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系统调用的更多相关文章

  1. 别出心裁的Linux系统调用学习法

    别出心裁的Linux系统调用学习法 操作系统与系统调用 操作系统(Operating System,简称OS)是计算机中最重要的系统软件,是这样的一组系统程序的集成:这些系统程序在用户对计算机的使用中 ...

  2. 关于Linux系统调用,内核函数【转】

    转自:http://blog.csdn.net/ubuntulover/article/details/5988220 早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么.当时突然想 ...

  3. Linux系统调用(转载)

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  4. linux内核剖析(六)Linux系统调用详解(实现机制分析)

    本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...

  5. Linux系统调用、新增系统调用方法【转】

    转自:http://blog.chinaunix.net/uid-25374603-id-3401045.html 说明: 系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源, ...

  6. 理解Linux系统调用

    目录 1.什么是系统调用 2.linux的系统调用 3.linux系统调用实现 1.什么是系统调用 系统调用,指的是操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的 ...

  7. ARM Linux系统调用的原理

    转载自:http://blog.csdn.net/hongjiujing/article/details/6831192 ARM Linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交 ...

  8. Linux系统调用及其效率

    操作系统相关概念: 操作系统---管理计算机硬件与软件资源的软件,是用户与系统操作交互的接口,为在它上面运行的程序提供服务. 操作系统内核 ----操作系统的核心.负责管理系统的进程.内核.设备驱动程 ...

  9. Linux系统调用过程分析

    參考: <Linux内核设计与实现> 0 摘要 linux的系统调用过程: 层次例如以下: 用户程序------>C库(即API):INT 0x80 ----->system_ ...

随机推荐

  1. PHP的错误处理方式(开发和上线)

    对于PHP开发人员来说,一旦某个产品投入使用.应该马上将 display_errors选项关闭.以免由于这些错误所透露的路径.数据库连接.数据表等信息而遭到黑客攻击. 可是.不论什么一个产品在投入使用 ...

  2. 【Python】Django RestFramework资料

    A ReSTful API is becoming a standard component of any modern web application.  The Django Rest Frame ...

  3. (转)Behavior Tree实践

    http://www.cnblogs.com/mavaL/archive/2013/04/07/3001860.html

  4. Sql server2005 优化查询速度50个方法小结

    Sql server2005 优化查询速度50个方法小结   Sql server2005优化查询速度51法查询速度慢的原因很多,常见如下几种,大家可以参考下.   I/O吞吐量小,形成了瓶颈效应.  ...

  5. 想控制GIF图片动画播放吗?试试gifffer.js

    在线演示:http://www.gbtags.com/gb/demoviewer/3578/c6bec39a-61ae-4017-8e23-e0bc1eeb740f/example|index.htm ...

  6. Android常用到的一些事件

    1:查看是否有存储卡插入 String status=Environment.getExternalStorageState(); if(status.equals(Enviroment.MEDIA_ ...

  7. sed 命令编辑文本

    1.sed 概述 sed 是一个非交互式文本编辑器.它能够对文本文件和标准输入进行编辑,标准输入能够是来自键盘输入.文件重定向.字符串.变量.甚至来自于管道文本. 2.sed工作流程简述 sed在处理 ...

  8. 在Eclipse中开发angularjs

    当然了,直接用Eclipse开发,完全没问题.我只是需要加个智能感知,安装一个Eclipse插件. Eclipse菜单->Help->Eclipse Marketplace 安装完以后,项 ...

  9. HBase in Action前三章笔记

    近期接触HBase,看了HBase In Action的英文版.開始认为还行,做了些笔记.可是兴许看下去,越来越感觉到实战这本书比較偏使用上的细节,对于HBase的具体设计涉及得很少.把前三章的一些笔 ...

  10. windows设置文件夹显示缩略图

      windows设置文件夹显示缩略图 CreateTime--2017年7月26日16:32:59Author:Marydon 为什么要显示缩略图? a.显示缩略图后,图片文件能够直接显示内容,不能 ...