用模板统一对多线程变量的使用

有时候需要定义全局变量供多个线程使用,为了对变量进行保护,需要对其进行加锁的操作

如果全局变量较多,每个变量都进行加锁的操作,会导致代码繁琐混乱

使用类模板,可以将加锁/解锁的操作统一

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

template <class T>
class tepltTest
{
    public:
        tepltTest();
        ~tepltTest();

        bool operator == (const T& cmp);
        bool operator != (const T& cmp);
        bool operator !();
        void operator =(const T& val); 
        operator T();//overloaded type conversion operator 

    private:
        inline void Lock()
        {
            printf("Lock\n");
            pthread_mutex_lock(&m_mutex);
        }
        inline void Unlock()
        {
            printf("Unlock\n");
            pthread_mutex_unlock(&m_mutex);
        }
        inline void InitializeLock()
        {
            printf("InitializeLock\n");
            pthread_mutexattr_t mattr;
            pthread_mutexattr_init(&mattr);
            pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
            pthread_mutex_init(&m_mutex, &mattr);
            pthread_mutexattr_destroy(&mattr);
        }
        inline void DeInitializeLock()
        {
            printf("DeInitializeLock\n");
            pthread_mutex_destroy(&m_mutex);
        }


    private:
        T tepltT;
        pthread_mutex_t m_mutex;    
};

template <class T>
tepltTest<T>::tepltTest() 
{
    printf("tepltTest\n");
    InitializeLock();
}

template <class T>
tepltTest<T>::~tepltTest() 
{
    printf("~tepltTest\n");
    DeInitializeLock();
}

template <class T>
bool tepltTest<T>::operator == (const T& cmp)
{
    printf("operator ==\n");
    bool ret;
    Lock();
    ret = (tepltT == cmp);
    Unlock();
    return ret;
}

template <class T>
bool tepltTest<T>::operator != (const T& cmp)
{
    printf("operator !=\n");
    bool ret;
    Lock();
    ret = (tepltT != cmp);
    Unlock();
    return ret;
}

template <class T>
bool tepltTest<T>::operator ! ()
{
    printf("operator !\n");
    bool ret;
    Lock();
    ret = !tepltT;
    Unlock();
    return ret;
}

template <class T>
void tepltTest<T>::operator = (const T& val)
{
    printf("operator =\n");
    Lock();
    tepltT = val;
    Unlock();
}

template<class T>
tepltTest<T>::operator T() {//overloaded type conversion operator 
    printf("operator T\n");
    T bRet;
    Lock();
    bRet = tepltT;
    Unlock();
    return bRet;
}

int main()
{
    tepltTest<int> intType;
    intType = 10;
    int tt = intType; //call operator T
    printf("tt is %d\n",tt);

}

上面的代码重载了 =、==、!、!=、以及类型转换等操作符,这样变量就可以保持原有的使用方式

因为使用了模板的方式,所以在定义这些变量后,他们就是由我们定义的tepltTest类实例化出来的对象,C++不允许把类的对象转换为基本的数据类型,因此通过类型转换函数来解决这个问题。

定义类型转换函数一般形式:

operator 目标类型()
{
    ...
    return 目标类型的数据;
}

目标类型是所要转化成的类型名,既可以是预定义及基本类型也可以是自定义类型。类型转换函数的函数名(operator 目标类型)前不能指定返回类型,且没有参数但在函数体最后一条语句一般为return语句,返回的是目标类型的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值