å¨æäºç³»ç»ä¸ï¼éè¦ä½ èªå·±æ¥æ建èªå·±çå¼æ¥å¤ä»»å¡å¤çæ¡æ¶ãéè¿è¿ç§å¤ä»»å¡å¤çï¼å¯ä»¥èªå·±å®ç°äºä»¶é©±å¨ç¼ç¨æ¨¡åçä¸ä¸ªå°é¨åãå½ç¶ï¼event driven is good for computer but not for human beingsï¼äººè¦æ¯äºä»¶é©±å¨ï¼è¦ä¹ä»æ¯æ¶é²éåï¼è¦ä¹ä»å¾å¤±è´¥ï¼åµåµãå¦å¤ï¼å½åå¨å
¸åçæ
åµ âçå¾
æ°æ®->å¤çæ°æ®->çå¾
æ°æ®â循ç¯æ¶ï¼ç¨å¼æ¥å¤çè½å¤å¤§å¤§å¢å ç³»ç»çæ§è½ï¼å°¤å
¶æ¯åºç°æ°æ®åå¤çäºç¸ä¾èµçå
³ç³»æ¶ãå¦ï¼ä»»å¡Açè¾åºæ°æ®æ¯ä»»å¡Bçè¾å
¥ï¼èBçè¾åºåæ¯Cçè¾å
¥ï¼èä¸BåCå¨è¿è¡æ°æ®å¤çä¹åéè¦è±è´¹å¤§éæ¶é´æ¥ååå§åï¼çº¿æ§å¤çæ¾ç¶ä¼ææ§è½ç¶é¢ãéç¨å¼æ¥å¤çè½æ¹åè¿ç§æ
åµï¼å½æå¤ä¸ªå¤çå¨æ¶æ§è½å°å¾å°æ大çæé«ã
æ¬ææè¿°çå¼æ¥å¤ä»»å¡æ¯éè¿åä¸è¿ç¨å
çè°åº¦å¨æ¥è°åº¦è¯¥è¿ç¨å
å¤ä¸ªå¼æ¥ä»»å¡ï¼è¿äºå¼æ¥ä»»å¡ççæ£æ§è¡æ¯éè¿å·¥ä½çº¿ç¨æ¥å®æãå
¶æ¨¡å为ï¼åå¼æ¥çä»»å¡åé请æ±åé»å¡ï¼å½å
¶è¯·æ±çä»»å¡å®æåï¼è°åº¦å¨å¤é该任å¡å¹¶æ§è¡ç¸åºçå¤çï¼ä¹è®¸ä¼å次åéä¸ä¸ªè¯·æ±ï¼ãè¿æ¶ä¸ä¸ªå
¸åçç产è
/æ¶è´¹è
çé®é¢ï¼å¨è°åº¦å¨ä¸ï¼ç产è
æ¯ä»»å¡ï¼èè°åº¦å¨æ¯æ¶è´¹è
ãä¸æ¦ä»»å¡ç请æ±å®æï¼è°åº¦å¨åæ§è¡è¯¥ä»»å¡ã
å¤çæµç¨
ç±äºscheduleræ¯å¨ä¸ä¸ªè¿ç¨ä¸ï¼å æ¤éè¦å
å°schedulerå®è£
å°è¿ç¨ä¸ï¼ç¶åå°åå¼æ¥ä»»å¡æ·»å å°schedulerï¼ä¹åï¼åå¼æ¥ä»»å¡åé第ä¸ä¸ªè¯·æ±çå¾
å®æãæåå¯å¨schedulerï¼å¤çå个已ç»å®æ请æ±ãå¦ä¸å¾æ示ï¼
ä»»å¡
æ¯ä¸ªä»»å¡é½åºå½ç»§æ¿èªåä¸ä¸ªåºç±»ä»¥ä½¿å¾è°åº¦å¨å¯ä»¥ä»¥ç¸åçæ¹å¼å¤çä»ä»¬ãæ¯ä¸ªæ´¾ççä»»å¡é½åºå½å
å«ï¼è³å°ï¼ä¸ä¸ªå¼æ¥æä½ï¼ææå±å¯¹è±¡ï¼ï¼è¯¥æä½å¯ä»¥æ§è¡1~n次ãæ¯æ¬¡å¼æ¥æä½å®æä¹åï¼å
¶Run()å½æ°å°è¢«è°ç¨ä»¥è¿è¡åç»å¤çãå æ¤ï¼ä»»å¡è³å°åºå½å
·æä¸ä¸ªç¶ææåç¨äºæ示该任å¡æå¤çç¶æãå½ä»»å¡å¤çå®æ¯ä¹åï¼ä»»å¡å¯ä»¥æèªå·±ä»è°åº¦éåä¸ç§»åºãç±äºæ·»å ä»»å¡å°è°åº¦éåçæä½åºå½ç±è°åº¦å¨èä¸æ¯ä»»å¡æ¬èº«æ¥åï¼å æ¤ï¼ä¸éè¦Add()æä½ãå æ¤ï¼ä»»å¡ç±»åºå½è±¡è¿æ ·ï¼
å
¶ä¸ï¼
StartWorker()ãDequeue()é½æ¯ç±TaskBaseæ¥å®ç°çï¼
int TaskBase::Dequeue()
{
Scheduler* sched = SchedulerInstance::GetInstance();
int ret = ErrNone;
m_Mutex->Lock();
if (sched && m_Status != TaskPending)
sched->Remove(this);
else
ret = ErrTaskBusy;
m_Mutex->Unlock();
return ret;
}
int TaskBase::StartWorker()
{
Scheduler* sched = SchedulerInstance::GetInstance();
int ret = ErrNone;
m_Mutex->Lock();
if (sched && (m_Status != TaskPending || m_Status != NotAvailable))
{
m_Worker->RunThread(this);
}
else
ret = ErrTaskBusy;
m_Mutex->Unlock();
return ret;
}
void TaskBase::CancelWorker()
{
Scheduler* sched = SchedulerInstance::GetInstance();
m_Mutex->Lock();
if (sched && m_Status == TaskPending)
{
m_Worker->Cancel();
m_Status = TaskCancelled;
}
m_Mutex->Unlock();
}
ç±äºä½¿ç¨äºå·¥ä½çº¿ç¨æ¥è¿è¡çæ£çå¼æ¥æä½ï¼å æ¤ï¼åºå½æä¸ä¸ªéæå½æ°æ¥ä½ä¸ºçº¿ç¨çå
¥å£å½æ°ã
å
¶å®ç°ä¸ºï¼
void WorkerThread::ThreadFunction(void* aData)
{
TaskBase* task = static_cast<TaskBase*>(aData);
if (task)
task->IssueRequest();
// Notify the Scheduler
Scheduler* sched = SchedulerInstance::GetInstance();
if (sched)
sched->Notify();
}
ç±äºå·¥ä½çº¿ç¨çå®ç°ä¸å¹³å°ç¸å
³ï¼å æ¤æ¤å¤ååºLinuxå¹³å°çå
¸åå®ç°ï¼
void LinuxThread::RunThread(void* aData)
{
pthread_create(&m_TID, NULL, WorkerThread::ThreadFunction, aData);
Scheduler* sched = SchedulerInstance::GetInstance();
if (sched)
sched->Notify();
}
void LinuxThread::Cancel()
{
pthread_cancel(m_TID);
Scheduler* sched = SchedulerInstance::GetInstance();
if (sched)
sched->Notify();
}
温馨提示:答案为网友推荐,仅供参考