ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

VCʵÏÖÏ̳߳Ø(Ò»)
2014-11-23 21:30:27 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:1352´Î
Tags£ºÊµÏÖ Ïß³Ì

ÕâÁ½ÌìÔÚ×ö¹ØÓÚÍøÂçÖ©ÖëµÄ³ÌÐò,Ï£Íû¿ÉÒÔͨ¹ýÏ̳߳ØÀ´Ìá¸ß³ÌÐòµÄÐÔÄÜ,ÍøÉÏËÑË÷ÁËÒ»ÏÂ,¿´µ½Õâ·½ÃæµÄ¶«Î÷»¹²»ÉÙ,¸ú´ó¼Ò·ÖÏíÒ»ÏÂ!~ÓÐÐí¶àÓ¦ÓóÌÐò´´½¨µÄÏ̻߳¨·ÑÁË´óÁ¿Ê±¼äÔÚ˯Ãß״̬À´µÈ´ýʼþµÄ·¢Éú¡£»¹ÓÐһЩÏ߳̽øÈë˯Ãß״̬ºó¶¨ÆÚ±»»½ÐÑÒÔÂÖѯ¹¤×÷·½Ê½À´¸Ä±ä»òÕ߸üÐÂ״̬ÐÅÏ¢¡£Ï̳߳ؿÉÒÔÈÃÄã¸üÓÐЧµØʹÓÃỊ̈߳¬ËüΪÄãµÄÓ¦ÓóÌÐòÌṩһ¸öÓÉϵͳ¹ÜÀíµÄ¹¤×÷ÕßÏ̳߳ء£ÖÁÉÙ»áÓÐÒ»¸öÏß³ÌÀ´¼àÌý·Åµ½Ï̳߳صÄËùÓеȴý²Ù×÷£¬µ±µÈ´ý²Ù×÷Íê³Éºó£¬Ï̳߳ØÖн«»áÓÐÒ»¸ö¹¤×÷ÕßÏß³ÌÀ´Ö´ÐÐÏàÓ¦µÄ»Øµ÷º¯Êý¡£
ÄãÒ²¿ÉÒÔ°ÑûÓеȴý²Ù×÷µÄ¹¤×÷ÏîÄ¿·Åµ½Ï̳߳ØÖУ¬ÓÃQueueUserWorkItemº¯ÊýÀ´Íê³ÉÕâ¸ö¹¤×÷£¬°ÑÒªÖ´ÐеŤ×÷ÏîÄ¿º¯Êýͨ¹ýÒ»¸ö²ÎÊý´«µÝ¸øÏ̳߳ء£¹¤×÷ÏîÄ¿±»·Åµ½Ï̳߳ØÖк󣬾Ͳ»ÄÜÔÙÈ¡ÏûÁË¡£
Timer-queue timersºÍRegistered wait operationsҲʹÓÃÏ̳߳ØÀ´ÊµÏÖ¡£ËûÃǵĻص÷º¯ÊýÒ²·ÅÔÚÏ̳߳ØÖС£ÄãÒ²¿ÉÒÔÓÃBindIOCompletionCallbackº¯ÊýÀ´Í¶µÝÒ»¸öÒì²½IO²Ù×÷£¬ÔÚIOÍê³É¶Ë¿ÚÉÏ£¬»Øµ÷º¯ÊýÒ²ÊÇÓÉÏ̳߳ØÏß³ÌÀ´Ö´ÐС£
µ±µÚÒ»´Îµ÷ÓÃQueueUserWorkItemº¯Êý»òÕßBindIOCompletionCallbackº¯ÊýµÄʱºò£¬Ï̳߳ر»×Ô¶¯´´½¨£¬»òÕßTimer-queue timers»òÕßRegistered wait operations·ÅÈë»Øµ÷º¯ÊýµÄʱºò£¬Ï̳߳ØÒ²¿ÉÒÔ±»´´½¨¡£Ï̳߳ؿÉÒÔ´´½¨µÄÏß³ÌÊýÁ¿²»ÏÞ£¬½öÊÜÏÞÓÚ¿ÉÓõÄÄڴ棬ÿһ¸öÏß³ÌʹÓÃĬÈϵijõʼ¶ÑÕ»´óС£¬ÔËÐÐÔÚĬÈϵÄÓÅÏȼ¶ÉÏ¡£
Ï̳߳ØÖÐÓÐÁ½ÖÖÀàÐ͵ÄỊ̈߳ºIOÏ̺߳ͷÇIOÏ̡߳£IOÏ̵߳ȴýÔڿɸ澯״̬£¬¹¤×÷ÏîÄ¿×÷ΪAPC·Åµ½IOÏß³ÌÖС£Èç¹ûÄãµÄ¹¤×÷ÏîÄ¿ÐèÒªÏß³ÌÖ´ÐÐÔڿɾ¯¸æ״̬£¬ÄãÓ¦¸Ã½«Ëü·Åµ½IOÏ̡߳£
·ÇIO¹¤×÷ÕßÏ̵߳ȴýÔÚIOÍê³É¶Ë¿ÚÉÏ£¬Ê¹Ó÷ÇIOÏ̱߳ÈIOÏß³ÌЧÂʸü¸ß£¬Ò²¾ÍÊÇ˵£¬Ö»ÒªÓпÉÄܵĻ°£¬¾¡Á¿Ê¹Ó÷ÇIOÏ̡߳£IOÏ̺߳ͷÇIOÏß³ÌÔÚÒì²½IO²Ù×÷ûÓÐÍê³É֮ǰ¶¼²»»áÍ˳ö¡£È»¶ø£¬²»ÒªÔÚ·ÇIOÏß³ÌÖз¢³öÐèÒªºÜ³¤Ê±¼ä²ÅÄÜÍê³ÉµÄÒì²½IOÇëÇó¡£
ÕýȷʹÓÃÏ̳߳صķ½·¨ÊÇ£¬¹¤×÷ÏîÄ¿º¯ÊýÒÔ¼°Ëü½«»áµ÷Óõ½µÄËùÓк¯Êý¶¼±ØÐëÊÇÏ̳߳ذ²È«µÄ¡£°²È«µÄº¯Êý²»Ó¦¸Ã¼ÙÉèÏß³ÌÊÇÒ»´ÎÐÔÏ̵߳ĻòÕßÊÇÓÀ¾ÃÏ̡߳£Ò»°ãÀ´Ëµ£¬Ó¦¸Ã±ÜÃâʹÓÃÏ̱߳¾µØ´æ´¢ºÍ·¢³öÐèÒªÓÀ¾ÃÏ̵߳ÄÒì²½IOµ÷Ó㬱ÈÈç˵RegNotifyChangeKeyValueº¯Êý¡£Èç¹ûÐèÒªÔÚÓÀ¾ÃÏß³ÌÖÐÖ´ÐÐÕâÑùµÄº¯ÊýµÄ»°£¬¿ÉÒÔ¸øQueueUserWorkItem´«µÝÒ»¸öÑ¡ÏîWT_EXECUTEINPERSISTENTTHREAD¡£
×¢Ò⣬Ï̳߳ز»ÄܼæÈÝCOMµÄµ¥Ïß³ÌÌ׼䣨STA£©Ä£ÐÍ¡£

ΪÁ˸üÉîÈëµØ½²½â²Ù×÷ϵͳʵÏÖµÄÏ̳߳صÄÓÅÔ½ÐÔ£¬ÎÒÃÇÊ×Ïȳ¢ÊÔ×Å×Ô¼ºÊµÏÖÒ»¸ö¼òµ¥µÄÏ̳߳ØÄ£ÐÍ¡£

´úÂëÈçÏ£º

/************************************************************************/
/* Test Our own thread pool. */
/************************************************************************/

typedef struct _THREAD_POOL
{
HANDLE QuitEvent;
HANDLE WorkItemSemaphore;

LONG WorkItemCount;
LIST_ENTRY WorkItemHeader;
CRITICAL_SECTION WorkItemLock;

LONG ThreadNum;
HANDLE *ThreadsArray;

}THREAD_POOL, *PTHREAD_POOL;

typedef VOID (*WORK_ITEM_PROC)(PVOID Param);

typedef struct _WORK_ITEM
{
LIST_ENTRY List;

WORK_ITEM_PROC UserProc;
PVOID UserParam;

}WORK_ITEM, *PWORK_ITEM;


DWORD WINAPI WorkerThread(PVOID pParam)
{
PTHREAD_POOL pThreadPool = (PTHREAD_POOL)pParam;
HANDLE Events[2];

Events[0] = pThreadPool->QuitEvent;
Events[1] = pThreadPool->WorkItemSemaphore;

for(;;)
{
DWORD dwRet = WaitForMultipleObjects(2, Events, FALSE, INFINITE);

if(dwRet == WAIT_OBJECT_0)
break;

//
// execute user's proc.
//

else if(dwRet == WAIT_OBJECT_0 +1)
{
PWORK_ITEM pWorkItem;
PLIST_ENTRY pList;

EnterCriticalSection(&pThreadPool->WorkItemLock);
_ASSERT(!IsListEmpty(&pThreadPool->WorkItemHeader));
pList = RemoveHeadList(&pThreadPool->WorkItemHeader);
LeaveCriticalSection(&pThreadPool->WorkItemLock);

pWorkItem = CONTAINING_RECORD(pList, WORK_ITEM, List);
pWorkItem->UserProc(pWorkItem->UserParam);

InterlockedDecrement(&pThreadPool->WorkItemCount);
free(pWorkItem);
}

else
{
_ASSERT(0);
break;
}
}

return 0;
}

BOOL InitializeThreadPool(PTHREAD_POOL pThreadPool, LONG ThreadNum)
{
pThreadPool->QuitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 ÏÂÒ»Ò³ βҳ 1/3/3
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºADOµÚÒ»´ÎÇ×ÃܽӴ¥¨DADO¿ª·¢Êµ¼ùÖ.. ÏÂһƪ£ºVisual C++±¾µØ²¢Ðбà³ÌÖеÄ״̬..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿