⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtask.c

📁 多任务下的数据结构与算法的源码
💻 C
字号:
/*
 * Copyright (c) 2000-2008
 * Author: Weiming Zhou
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  
 */

#ifdef _WIN32
#include <windows.h>
#endif 

#include "CapiGlobal.h"
#include "MTask.h"

/**	多任务资源释放的创建函数

	@return	MTASK * - 多任务释放结构指针	
*/
MTASK *MTask_Create()
{
    MTASK  *pMTask;

    pMTask = (MTASK *)malloc( sizeof(MTASK) );
    
    if ( pMTask != NULL )
    {
        pMTask->pLock = LockCreate();
        if ( pMTask->pLock == NULL )
        {
            free( pMTask );
            return NULL;
        }
        pMTask->pExitEvent = EventCreate();
        if ( pMTask->pExitEvent == NULL )
        {
            LockClose( pMTask->pLock );
            free( pMTask );
            return NULL;
        }
        pMTask->uTaskCount = 0;
        pMTask->uExitFlag = MTASK_NO_EXIT;
    }
    return pMTask;
}


/**	多任务资源释放的释放函数

	@param	MTASK *pMTask - 多任务释放结构指针	
	@return	void - 无	
*/
void MTask_Destroy(MTASK *pMTask)
{
    Lock( pMTask->pLock );
    
    pMTask->uExitFlag = MTASK_EXIT;
    
    if ( pMTask->uTaskCount != 0 )
    {
        Unlock( pMTask->pLock );
        WaitEvent( pMTask->pExitEvent );
    }
    else
    {
        Unlock( pMTask->pLock );
    }

    /* 关闭操作的锁和退出事件 */
    LockClose( pMTask->pLock );
    EventClose( pMTask->pExitEvent );   
    
    free( pMTask );
}

/**	多任务资源释放的锁操作函数

	@param	MTASK *pMTask - 多任务释放结构指针	
	@return	void - 无	
*/
void MTask_Lock(MTASK *pMTask)
{
    Lock( pMTask->pLock );
}

/**	多任务资源释放的解锁操作函数

	@param	MTASK *pMTask - 多任务释放结构指针	
	@return	void - 无	
*/
void MTask_Unlock(MTASK *pMTask)
{
    Unlock( pMTask->pLock );
}

/**	多任务资源释放的获取退出标志函数

	@param	MTASK *pMTask - 多任务释放结构指针	
	@return	UINT - 退出标志,MTASK_NO_EXIT表示不退出,MTASK_EXIT表示退出	
*/
UINT MTask_GetExitFlag(MTASK *pMTask)
{
    UINT    uExitFlag;

    Lock( pMTask->pLock );
    uExitFlag = pMTask->uExitFlag;
    Unlock( pMTask->pLock );

    return uExitFlag;
}


/**	设置退出标志函数

	@param	MTASK *pMTask - 多任务释放结构指针	
	@param	UINT uExitFlag - 退出标志,MTASK_NO_EXIT表示不退出,
                             MTASK_EXIT表示退出	
	@return	void - 无	
*/
void MTask_SetExitFlag(MTASK *pMTask, UINT uExitFlag)
{
    Lock( pMTask->pLock );
    pMTask->uExitFlag = uExitFlag;
    Unlock( pMTask->pLock );
}


/**	进入操作任务函数,作用是使计数变量加1

	@param	MTASK *pMTask - 多任务释放结构指针	
	@return	void - 无	
*/
void MTask_EnterTask(MTASK *pMTask)
{
    Lock( pMTask->pLock );
    pMTask->uTaskCount += 1;
    Unlock( pMTask->pLock );
}

/**	离开操作任务函数,作用是使计数变量减1,当计数变量为0时
    发送退出事件通知释放操作任务可以释放了

	@param	MTASK *pMTask - 多任务释放结构指针	
	@return	void - 无	
*/
void MTask_LeaveTask(MTASK *pMTask)
{
    Lock( pMTask->pLock );

    pMTask->uTaskCount -= 1;
    
    if ( pMTask->uTaskCount == 0 )
    {
        SendEvent( pMTask->pExitEvent );
    }

    Unlock( pMTask->pLock );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -