X265-线程池-1

1.WorkerThread的threadMain方法

功能:工作线程的主方法,会把当前的任务执行完毕,如果线程池中,仍然有需要执行的高优先级的工作(m_wantedhelp, priority<cur_priority),会处理完这类所有的工作,然后进行

休眠。如果有任务的话,会被唤醒。

void WorkerThread::threadMain()
{
    THREAD_NAME("Worker", m_id);

#if _WIN32
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
#else
    __attribute__((unused)) int val = nice(10);
#endif

    m_pool.setCurrentThreadAffinity();

    sleepbitmap_t idBit = (sleepbitmap_t)1 << m_id;//线程睡眠根据的是二进制的位是否为1来确定的,获取当前workthread的二进制数,其中m_id表示为1的index
    m_curJobProvider = m_pool.m_jpTable[0];//获取第0个当前的job(任务),即workthread和jobprovider进行绑定,是相同的jobprovider尽量在同一个workthread上运行,提升效率
    m_bondMaster = NULL;//初始化为NULL

    SLEEPBITMAP_OR(&m_curJobProvider->m_ownerBitmap, idBit);//把记录jobprovider的m_ownerBitmap的该workthread的m_id位置为1
    SLEEPBITMAP_OR(&m_pool.m_sleepBitmap, idBit);//把m_pool记录睡眠线程的m_id位置置为1
    m_wakeEvent.wait();//然后睡眠等待,jobprovider的唤醒

    while (m_pool.m_isActive)
    {
        if (m_bondMaster)   //如果有bondMaster,就调用processTasks来处理任务
        {
            m_bondMaster->processTasks(m_id);
            m_bondMaster->m_exitedPeerCount.incr();
            m_bondMaster = NULL;
        }

        do
        {
            /* do pending work for current job provider */
            m_curJobProvider->findJob(m_id);//处理当前的任务

            /* if the current job provider still wants help, only switch to a
             * higher priority provider (lower slice type). Else take the first
             * available job provider with the highest priority */
            int curPriority = (m_curJobProvider->m_helpWanted) ? m_curJobProvider->m_sliceType :
                                                                 INVALID_SLICE_PRIORITY + 1;//获取当前job的优先级
            int nextProvider = -1;
            for (int i = 0; i < m_pool.m_numProviders; i++)
            {
                if (m_pool.m_jpTable[i]->m_helpWanted &&
                    m_pool.m_jpTable[i]->m_sliceType < curPriority)
                {
                    nextProvider = i;
                    curPriority = m_pool.m_jpTable[i]->m_sliceType;//获取比当前jobprovider优先级高的最高优先级的任务
                }
            }
            if (nextProvider != -1 && m_curJobProvider != m_pool.m_jpTable[nextProvider])
            {
                SLEEPBITMAP_AND(&m_curJobProvider->m_ownerBitmap, ~idBit);//当前的jobprovider不在绑定当前的workthread
                m_curJobProvider = m_pool.m_jpTable[nextProvider];//获取最高优先级的jobprovider
                SLEEPBITMAP_OR(&m_curJobProvider->m_ownerBitmap, idBit);//绑定当前的workthread
            }
        }
        while (m_curJobProvider->m_helpWanted);

        /* While the worker sleeps, a job-provider or bond-group may acquire this
         * worker's sleep bitmap bit. Once acquired, that thread may modify 
         * m_bondMaster or m_curJobProvider, then waken the thread */
        SLEEPBITMAP_OR(&m_pool.m_sleepBitmap, idBit);//然后睡眠,等待被唤醒
        m_wakeEvent.wait();
    }

    SLEEPBITMAP_OR(&m_pool.m_sleepBitmap, idBit);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值