c++同步任务队列的实现

2020-02-28  本文已影响0人  help_youself

 代码来源[1]。

    long STaskLoop::postTask(const IRunnable *runnable, bool waitUntilDone, int priority)
    {
        if (m_thread.isStopped())
        {
            return -1;
        }
        IRunnable *pCloneRunnable = runnable->clone();
        if (Thread::getCurrentThreadID() == m_thread.getThreadID() && waitUntilDone)
        {
            pCloneRunnable->run();
            delete pCloneRunnable;
            return -1;
        }

        SSemaphore semaphore;
        TaskItem item(pCloneRunnable,priority);

        if (waitUntilDone)
        {
            item.semaphore = &semaphore;
        }

        m_taskListLock.Enter();

        item.taskID = m_nextTaskID;
        m_nextTaskID = (m_nextTaskID + 1) & ((std::numeric_limits<long>::max)());
        std::list<TaskItem>::reverse_iterator it= m_items.rbegin();
        while(it != m_items.rend())
        {
            if(it->nPriority>=priority)
            {
                m_items.insert(it.base(),item);
                break;
            }
            it ++;
        }
        if(it==m_items.rend())
            m_items.push_front(item);

        m_taskListLock.Leave();
        m_itemsSem.notify();

        if (waitUntilDone)
        {
            int ret = semaphore.wait();

            if (ret == RETURN_ERROR)
            {
            }
        }

        return item.taskID;
    }

 之前有分析过webrtc中invoke函数的实现[2]。
[1] TaskLoop.cpp
[2] 从webrtc的Thread::Invoke谈起

上一篇 下一篇

猜你喜欢

热点阅读