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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keheinash/article/details/51427681

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

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

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

#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语句,返回的是目标类型的数据。

猜你喜欢

转载自blog.csdn.net/keheinash/article/details/51427681