• 用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
  • 相关阅读:
    Javascript DOM 编程艺术读书笔记16/03/25
    2014 Multi-University Contest 1.1 hdu4861 打表找规律
    汇编小记16/3/23
    汇编小记16/3/22
    hdoj 4940 强连通图
    Head FIRST HTML & CSS 16/03/17
    html&css一些有用的网站整理
    dosbox+debug 模拟dos
    汇编小记16/3/15
    解决windwos另存为,保存文件时无法选择“桌面”文件夹
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4151019.html
Copyright © 2020-2023  润新知