static void* task1(void* arg) { static volatile long res = 1; for (long i = 0; i < 10000000; ++i) { res ^= (i + 1) * 3 >> 2; } return doneTask(arg); }
static void* task2(void* arg) { static volatile long res = 1; for (long i = 0; i < 1000000; ++i) { res ^= (i + 1) * 3 >> 2; if (i % 100000 != 0) { continue; } if (*static_cast<bool*>(arg)) { pth_yield(NULL); } else { sched_yield(); } } return doneTask(arg); }
// Manage TaskQueue void CTaskManager::run(void) { IRunnable *runnableTask; float priorityTask = 0.f; while(_ThreadRunning) { { CSynchronized<list<CWaitingTask> >::CAccessor acces(&_TaskQueue); if(acces.value().empty()) { runnableTask = NULL; } else { // Update task priorities changeTaskPriority (); // Get the best task list<CWaitingTask> &taskList = acces.value(); list<CWaitingTask>::iterator ite = taskList.begin(); list<CWaitingTask>::iterator bestIte = ite; while (ite != taskList.end()) { if (ite->Priority < bestIte->Priority) bestIte = ite; // Next task; ite++; } _IsTaskRunning = true; runnableTask = bestIte->Task; priorityTask = bestIte->Priority; taskList.erase (bestIte); } } if(runnableTask) { { CSynchronized<string>::CAccessor currentTask(&_RunningTask); string temp; runnableTask->getName(temp); currentTask.value () = temp + " " + toString (priorityTask); } runnableTask->run(); { CSynchronized<string>::CAccessor currentTask(&_RunningTask); CSynchronized<deque<string> >::CAccessor doneTask(&_DoneTaskQueue); doneTask.value().push_front (currentTask.value ()); currentTask.value () = ""; if (doneTask.value().size () > NLMISC_DONE_TASK_SIZE) doneTask.value().resize (NLMISC_DONE_TASK_SIZE); } _IsTaskRunning = false; } else { sleepTask(); } } CBigFile::getInstance().currentThreadFinished(); _ThreadRunning = true; }
static void* task3(void* arg) { return doneTask(arg); }