• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-379  評論-37  文章-0  trackbacks-0

            ? 動態任務分解方式分類:非嵌套型動態任務,嵌套型動態任務。

            1、非嵌套型動態任務
            ??????使用分布式隊列

            2、嵌套型動態任務
            ??????嵌套型任務通常有一個或多個開始任務,其他任務的產生均源自于開始任務。
            ??????調度方法:每個線程都有一個本地隊列,另外所有線程擁有一個共享隊列。當每個線程產生N個任務時,首先選擇一個任務送入本地隊列,然后將其他任務送入共享隊列。

            ??????對應的CAPI代碼如下:


            ////////////////////////////////////////////////////////////////////////

            /*

            ?* Copyright (c) 2006-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.?

            ?*/

            ?

            /*

            ?*?? CNestTaskScheduler.h

            ?*

            ?* ? DESCRIPTION

            ?*?????? Module for Task Scheduler class

            ?*

            ?*?? HISTORY

            ?*?????? 06-08-2008??? create by zhouweiming.

            ?*

            ?*/

            #ifndef __CNESTTASKSCHEDULER_H__

            #define __CNESTTASKSCHEDULER_H__

            ?

            #include "CLocalQueue.h"

            #include "CStealQueue.h"

            #include "CDistributedQueue.h"

            ?

            class CNestTaskScheduler {

            private :

            ??? CThreadPool???? m_ThreadPool; //(TaskScheduler_StartFunc, NULL, 0);

            ??? CDistributedQueue<TASK, CLocalQueue<TASK>, CStealQueue<TASK>> m_DQueue;

            ??? THREADFUNC????? m_StartFunc;? // 為線程池使用的線程入口函數指針

            ??? LONG? volatile ? m_lTaskId;??? //Task Id, 用于判斷是否喚醒對應的線程

            ?

            public :

            ??? CNestTaskScheduler();

            ??? virtual ~CNestTaskScheduler(){};

            ?

            ?

            ??? // 下面兩個函數為調度器本身直接使用

            ??? void SetStartFunc(THREADFUNC StartFunc);

            ??? int GetTask(TASK &Task);

            ??? CThreadPool & GetThreadPool();

            ??? LONG AtomicIncrementTaskId();

            ???

            ??? // 下面三個函數為調度器的使用者使用

            ??? void SpawnLocalTask(TASK &Task);

            ??? void SpawnTask(TASK &Task);

            ??? void BeginRootThread(TASK &Task);

            };

            ?

            #endif //__CNESTTASKSCHEDULER_H__

            ?

            ////////////////////////////////////////////////////////////////////////

            /*

            ?* Copyright (c) 2006-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.?

            ?*/

            ?

            #include "CapiGlobal.h"

            #include "CThreadPool.h"

            #include "CLocalQueue.h"

            #include "CStealQueue.h"

            #include "CDistributedQueue.h"

            #include "CNestTaskScheduler.h"

            ?

            static unsigned int WINAPI NestTaskScheduler_StartFunc( void *pArgs);

            ?

            #define ???? NESTTASK_QUEUE_SIZE???? 128

            ?

            /**? 嵌套任務調度的構造函數

            ?

            ???? @return? constructor - ??

            */

            CNestTaskScheduler::CNestTaskScheduler()

            {

            ??? m_StartFunc = NestTaskScheduler_StartFunc;

            ?

            ??? int n = m_ThreadPool.GetThreadCount();

            ??? m_DQueue.Create(NESTTASK_QUEUE_SIZE, n, NESTTASK_QUEUE_SIZE, 0,

            ??????? ThreadPool_GetThreadId, &m_ThreadPool);

            }

            ?

            /**? 嵌套任務調度的設置線程池的入口函數

            ?

            ???? @param?? THREADFUNC StartFunc - 線程池的入口函數??

            ???? @return? void -

            */

            void CNestTaskScheduler::SetStartFunc(THREADFUNC StartFunc)

            {

            ??? m_StartFunc = StartFunc;

            }

            ?

            /**? 嵌套任務調度的獲取任務函數

            ?

            ???? @param?? TASK &Task - 接收從分布式隊列中獲取的任務

            ???? @return? int - 成功返回CAPI_SUCCESS, 失敗返回CAPI_FAILED.??

            */

            int CNestTaskScheduler::GetTask(TASK &Task)

            {

            ??? // 先從本地隊列獲取任務

            ??? // 本地獲取任務失敗后從共享隊列獲取任務

            ??? return m_DQueue.DeQueue(Task);

            };

            ?

            ?

            /**? 嵌套任務調度的獲取線程池函數

            ?

            ??? @return?? CThreadPool & - 返回線程池對象??

            */

            CThreadPool & CNestTaskScheduler::GetThreadPool()

            {

            ??? return m_ThreadPool;

            }

            ?

            /**? 嵌套任務調度的原子增加任務Id函數

            ?

            ??? @return?? int - 返回原子加后的任務Id.

            */

            LONG CNestTaskScheduler::AtomicIncrementTaskId()

            {

            ??? LONG Id = AtomicIncrement(&m_lTaskId);

            ??? return Id;

            }

            ?

            ?

            ?

            /**? 嵌套任務調度的生成當前線程的本地任務

            ??? 任務被放入當前線程的本地隊列中

            ?

            ???? @param?? TASK &Task - 待執行的任務??

            ???? @return? void -

            */

            void CNestTaskScheduler::SpawnLocalTask(TASK &Task)

            {

            ??? // 將任務放入本地隊列中

            ??? m_DQueue.PushToLocalQueue(Task);

            };

            ?

            ?

            /**? 嵌套任務調度的生成任務函數

            ??? 生成的任務被放入分布式隊列中

            ?

            ???? @param?? TASK &Task - 待執行的任務??

            ???? @return? void -

            */

            void CNestTaskScheduler::SpawnTask(TASK &Task)

            {

            ??? if ( m_lTaskId < m_ThreadPool.GetThreadCount() )

            ??? {

            ??????? // 依次喚醒各個掛起的線程

            ??????? LONG Id = AtomicIncrement(&m_lTaskId);

            ??????? if ( Id < m_ThreadPool.GetThreadCount() )

            ??????? {

            ??????????? // 下面之所以可以對其他線程的本地隊列進行無同步的操作,是因為

            ??????????? // 訪問這些隊列的線程在進隊操作之后才開始運行

            ??????????? m_DQueue.PushToLocalQueue(Task, Id);

            ??????????? m_ThreadPool.ExecThread(Id);

            ??????? }

            ??????? else

            ??????? {

            ??????????? m_DQueue.EnQueue(Task);

            ??????? }

            ??? }

            ??? else

            ??? {

            ??????? // 先判斷共享隊列是否滿,如果未滿則放入共享隊列中

            ??????? // 如果滿了則放入本地隊列中

            ??????? m_DQueue.EnQueue(Task);

            ??? }

            };

            ?

            ?

            /**? 嵌套任務調度的啟動根線程函數

            ?

            ???? @param?? TASK &Task - 要執行的最初任務???

            ???? @return? void -

            */

            void CNestTaskScheduler::BeginRootThread(TASK &Task)

            {

            ??? m_lTaskId = 0;

            ?

            ??? m_ThreadPool.CreateThreadPool(m_StartFunc, this , 0);

            ?

            ??? m_DQueue.PushToLocalQueue(Task, 0);

            ?

            ??? m_ThreadPool.ExecThread( 0 );?

            ?

            ??? m_ThreadPool.WaitAllThread();

            }

            ?

            /**? 嵌套任務調度的線程池入口函數

            ?

            ???? @param?? void *pArgs - CNestTaskScheduler 類型的參數????

            ???? @return? unsigned int WINAPI - 返回?

            */

            unsigned int WINAPI NestTaskScheduler_StartFunc( void *pArgs)

            {

            ??? CNestTaskScheduler? *pSched = (CNestTaskScheduler *)pArgs;

            ?

            ??? TASK??? Task;

            ??? int ???? nRet;

            ?

            ??? for ( ;; )

            ??? {

            ??????? nRet = pSched->GetTask(Task);

            ?

            ??????? if ( nRet == CAPI_FAILED )

            ??????? {

            ??????????? CThreadPool &ThreadPool = pSched->GetThreadPool();

            ???????????

            ??????????? // 喚醒一個掛起的線程,防止任務數量小于CPU核數時,

            ??????????? // 仍然有任務處于掛起狀態,從而導致WaitAllThread()處于死等狀態

            ??????????? // 這個喚醒過程是一個串行的過程,被喚醒的任務會繼續喚醒一個掛起線程

            ??????????? LONG Id = pSched->AtomicIncrementTaskId();

            ??????????? if ( Id < ThreadPool.GetThreadCount() )

            ??????????? {

            ??????????????? ThreadPool.ExecThread(Id);

            ??????????? }

            ??????????? break ;

            ??????? }

            ?

            ??????? (*(Task.func))(Task.pArg);

            ??? }

            ?

            ??? return 0;

            }

            ?


            ??????

            posted on 2010-01-17 17:57 小王 閱讀(683) 評論(0)  編輯 收藏 引用 所屬分類: 多核編程
            亚洲人成网站999久久久综合 | 久久久无码一区二区三区| 婷婷五月深深久久精品| 久久久久夜夜夜精品国产| 热久久国产欧美一区二区精品 | 国产午夜精品久久久久九九| 三级韩国一区久久二区综合| 久久无码人妻一区二区三区午夜| 国产高清国内精品福利99久久| 久久这里都是精品| 久久综合九色综合精品| 99蜜桃臀久久久欧美精品网站| 久久亚洲国产精品一区二区| 久久AV高潮AV无码AV| 91久久精品视频| 日本久久久久亚洲中字幕| 精品久久久久国产免费| 国产精品久久午夜夜伦鲁鲁| 久久天天躁狠狠躁夜夜2020一| 97r久久精品国产99国产精| 久久香综合精品久久伊人| 99久久伊人精品综合观看| 77777亚洲午夜久久多喷| yy6080久久| 色婷婷噜噜久久国产精品12p| 久久成人国产精品二三区| 久久偷看各类wc女厕嘘嘘| 久久久久久久久久久精品尤物| 午夜精品久久久久久久无码| 一本久久久久久久| 91精品国产高清久久久久久io | 久久99精品久久久久久久久久 | 国产成人精品久久| 欧美亚洲国产精品久久蜜芽| 欧美va久久久噜噜噜久久| 波多野结衣AV无码久久一区| 思思久久好好热精品国产| 亚洲?V乱码久久精品蜜桃| 久久精品桃花综合| 狠狠色丁香久久婷婷综合蜜芽五月| 久久久久国色AV免费看图片|