用c++封装linux系统调用

本文探讨了并发控制中资源锁机制的实现,通过自定义的读写锁类,展示了如何在多线程环境下实现共享资源的安全访问。通过实例演示了获取共享锁、释放共享锁、获取独占锁及释放独占锁的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值