Пример #1
0
void ThreadPool::yield(TaskGroup &wait)
{
    std::chrono::milliseconds waitSpan(10);
    uint32 id = _threadCount; // Threads not in the pool get a previously unassigned id

    auto iter = _idToNumericId.find(std::this_thread::get_id());
    if (iter != _idToNumericId.end())
        id = iter->second;

    while (!wait.isDone() && !_terminateFlag) {
        uint32 subTaskId;
        std::shared_ptr<TaskGroup> task;
        {
            std::unique_lock<std::mutex> lock(_taskMutex);
            if (!_taskCond.wait_for(lock, waitSpan, [this] {return _terminateFlag || !_tasks.empty();}))
                continue;
            task = acquireTask(subTaskId);
        }
        if (task)
            task->run(id, subTaskId);
    }
}