基于链表的进程内(多线程)通信

前面总结了一篇链表的文章,现基于该链表实现进程内的多线程通信方式。

typedef struct
{
    bool32 isWork;
    bool32 isExit;
    mutexHandle hMutex;
    queHandle hQueRdWr;//申请的链表结构体指针
    queHandle hQueAck;
    thrHandle hThr;//返回的线程句柄
    comCreateParam param;
    Ptr trustArgs;
    comTrustFxn trustFxn;
}comNodeObj;


/**************************************************
*
*
*
*******************************************************/
static Int32 encTrustFxn(Ptr pBody,Ptr pUsrArgs)
{
    Int32 status = SOK;
    encodeNode *pNode = (encodeNode *)pUsrArgs;
    comBody2Enc *pEncBody = (comBody2Enc *)pBody;

    switch(pEncBody->type)
    {
        case XXX:
        {
            ......
            break;
        }
        default:
            break;
    }
    if(status != SOK)
    {
        error();
    }
    return SOK;
}
/**********************************************
*
*
*
*************************************************/
Int32 comEntrust(Handle hCom,comTrustFxn pFxn,Ptr pUsrArgs)
{
    Int32 status;
    thrCreate thrParam;
    comNodeObj *pNode = (comNodeObj *)hCom;

    assertNotNull(pNode);
    assertNotNull(pFxn);

    if(pNode->hThr != NULL)
    {
        error("");
        return EFAIL;
    }

    clear(&thrParam);
    thrParam.OpThrRun = comTask;//线程主体函数
    thrParam.thrPol = SCHED_FIFO;
    thrParam.thrPri = HIGH;
    thrParam.stackSize = SIZE_DEFAULT;

    pNode->trustArgs = pUserArgs;
    pNode->trustFxn = pFxn;
    thrParam.pUsrArgs = pNode;

    status = thrCreate(&thrParam,&(pNode->hThr));
    if(status != OK)
    {
        return EFAIL;
    }
    return OK;
}
/*********************************
*创建通信节点
*
*
***********************************/
Int32 comCreate(comCreateParam *pParam,Handle *hCom)
{
    Int32 status = SOK;
    comNodeObj *pNode = NULL;

    *hCom = NULL;
    pNode = memAlloc(sizeof(comNodeObj));
    clear(pNode);

    queParam.maxElems = pParam->maxBodyBuf;
    status = queListCreate(&queParam,&(pNode->hQueRdWr));
    if(status != SOK)
    {
        error();
        memFree(pNode);
        return status;
    }

    queParam.maxElems = pParam->maxBodyBuf;
    status = queListCreate(&queParam,&(pNode->hQueAck));
    if(status != SOK)
    {
        error();
        queListDelete(pNode->hQueRdWr);
        memFree(pNode);
        return status;
    }

    memCpySize(&(pNode->param),pParam,sizeof(comCreateParam));
    mutexCreate(0,&pNode->hMutex);
    pObj->nodes[pParam->actor.nodeId] = pNode;
    *hVsfCom = pNode;

    return SOK;

}
Int32 encInit()
{
    Int32 status = SOK;
    encodeNode *pNode = NULL;
    encodeObject *pObj = &gEncObj;
    union
    {
        comCreateParam comParam;
        ......
    }initParam;

    clear(&initParam);
    cfgGetActor(COM_NODE_ID_ENCODE,&(initParam.comParam.actor));
    initParam.comParam.maxBodyBuf = 64;
    initParam.comParam.priority = PRIORITY_HIGH;
    initParam.comParam.sleepMs = 10;
    status = comCreate(&(initParam.comParam),&(pObj->hCom));
    status |= comEntrust(pObj->hCom,encTrustFxn,pNode);
    pObj->pNode = pNode;
    return SOK;
}

接下来看一个实例调用。

static Int32 palEncTxParam()
{
    Int32 status = SOK;
    comBody2Enc *pBody = NULL;
    comActor actor;
    videoEncObj *pObj = NULL;

    pObj = &gVideoEncObj[0];
    status = cfgGetActor(COM_NODE_ID_ENCODE,&actor);
    pBody = (comBody2Enc *)comNewBody(pObj->hCom,&actor,sizeof(comBody2Enc));
    pBody->type = ;
    pBody->stream = 0;
    pBody->channel = 0;
    if(size>0)
    {
        memCpySize(&(pBody->detail),pParam,size);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值