linux c++ 线程 基于模板方面的封装

本文介绍了一种基于C++的线程模型设计方法,利用模板元编程技术实现了灵活的多线程应用扩展。该设计允许通过组合不同的基类来定义执行体的行为,从而简化了多线程程序的开发过程。

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

#include<pthread.h>
#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include"CLStatus.h"
#include"CLLog.h"

using namespace std;

class CMyFunction
{
public:
    CLStatus RunExecutiveFunction(void *pContext)
    {
	int i = (int)pContext;
	cout << i << endl;
	return CLStatus(0, 0);
    }
};

template<typename TUser, typename TStored>
class CLTypeSaver
{
public:
    CLTypeSaver(TUser *pUser)
    {
	m_pUser = pUser;
    }

    virtual ~CLTypeSaver()
    {
    }

    static void* CallBackFunc(void *arg)
    {
	CLTypeSaver<TUser, TStored> *pThis = static_cast<CLTypeSaver<TUser, TStored> *>(arg);

	(*(pThis->m_pUser)).template GetStoredType<TStored>();

	delete pThis;

	return (void *)0;
    }

private:
    TUser *m_pUser;
};

class CLThread
{
public:
    template<typename TDerivedClass>
    CLStatus Create()
    {
	CLTypeSaver<CLThread, TDerivedClass> *pSaver = new CLTypeSaver<CLThread, TDerivedClass>((CLThread *)this);
	
	pthread_t tid;
	int r = pthread_create(&tid, NULL, CLTypeSaver<CLThread, TDerivedClass>::CallBackFunc, pSaver);
	if(r != 0)
	{
	    CLLog::WriteLogMsg("pthread_create error", r);
	    return CLStatus(-1, 0);
	}
    }

    template<typename TDerivedClass>
    void GetStoredType()
    {
	TDerivedClass *pDerived = static_cast<TDerivedClass *>(this);
	pDerived->ProcessByProxy();
    }
};

template<typename TExecutive, typename TExecutiveFunctionProvider>
class CLCoordinator : public TExecutive, public TExecutiveFunctionProvider
{
public:
    CLStatus Run(void *pContext)
    {
	m_pContext = pContext;

	TExecutive *pExecutive = static_cast<TExecutive *>(this);

	typedef CLCoordinator<TExecutive, TExecutiveFunctionProvider> T;
	
	return (*pExecutive).template Create<T>();
    }

    void ProcessByProxy()
    {
	TExecutiveFunctionProvider *pProvider = static_cast<TExecutiveFunctionProvider*>(this);
	pProvider->RunExecutiveFunction(m_pContext);
    }

private:
    void *m_pContext;
};

int main()
{
    CLCoordinator<CLThread, CMyFunction> t1;
    t1.Run((void *)5);
    
    sleep(5);
    return 0;
}

CLTypeSaver是为了提供线程入口函数以及参数的。

当需要扩展时,即创建不同类型执行体,执行不同业务逻辑时,只需要新增加基类而不是派生类
每个模板参数,即基类,代表一个方面
创建线程还是进程,执行何种业务逻辑,甚至协调器本身均可以装配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值