码迷,mamicode.com
首页 > 编程语言 > 详细

用c++封装linux系统调用

时间:2014-12-08 15:16:15      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   ar   color   os   sp   

#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(0),wr_cnt(0)
        {
            pthread_mutex_init(&cnt_mutex, NULL);
            pthread_cond_init(&rw_cond, NULL);
        }

    void get_shared_lock()
        {
            pthread_mutex_lock(&cnt_mutex);
            while (wr_cnt >0)
                {
                    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 (0 == 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>0)
                {
                    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()%100;
            pthread_t* threads = new pthread_t[THREADS_NO];

            for(int i=0; i<THREADS_NO; i++)
                {
                    ThreadFunc tmpfunc = rand()%2? shared_task_handler : exclusive_task_handler;
                    if (pthread_create(threads+i,NULL,tmpfunc,this))
                        {
                            cerr << "pthread_create fails" << endl;
                            exit(1);
                        }
                }

            for(int i=0; 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系统调用

标签:des   style   blog   http   io   ar   color   os   sp   

原文地址:http://www.cnblogs.com/leijiangtao/p/4151019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!