zoukankan      html  css  js  c++  java
  • 用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(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
  • 相关阅读:
    20145204《信息安全系统设计基础》期中总结
    20145204&20145212信息安全系统实验一报告
    k8s运维记
    服务器免密登录
    非正常关闭vi编辑器产生swp文件怎么删除
    centos7 安装 python3 、docker、 docker-compose 脚本
    数据库高可用方案
    centos7安装docker-compose报错解决办法
    centos7 一键安装python3 --转发
    安装docker-compose的两种方式
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4151019.html
Copyright © 2011-2022 走看看