当前位置: 首页>>代码示例>>C++>>正文


C++ WorkItem::runnableFunction方法代码示例

本文整理汇总了C++中WorkItem::runnableFunction方法的典型用法代码示例。如果您正苦于以下问题:C++ WorkItem::runnableFunction方法的具体用法?C++ WorkItem::runnableFunction怎么用?C++ WorkItem::runnableFunction使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在WorkItem的用法示例。


在下文中一共展示了WorkItem::runnableFunction方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: ASSERT

/*
 * DWORD vislib::sys::ThreadPool::Worker::Run
 */
DWORD vislib::sys::ThreadPool::Worker::Run(void *pool) {
    ASSERT(pool != NULL);
    this->pool = static_cast<ThreadPool *>(pool);

    VLTRACE(Trace::LEVEL_VL_INFO, "Worker thread [%u] started.\n", 
        Thread::CurrentID());

    while (true) {

        /* Wait for work. */
        VLTRACE(Trace::LEVEL_VL_INFO, "ThreadPool thread [%u] is waiting for "
            "work ...\n", Thread::CurrentID());
        this->pool->semBlockWorker.Lock();

        /* Acquire locks. */
        this->pool->lockQueue.Lock();
        this->pool->lockThreadCounters.Lock();

        /*
         * We use an empty queue as trigger for a thread to leave: If we wake a
         * thread and it does not find any work to do, it should exit.
         */
        if (this->pool->queue.IsEmpty()) {
            VLTRACE(Trace::LEVEL_VL_INFO, "ThreadPool thread [%u] is "
                "exiting ...\n", Thread::CurrentID());
            if (--this->pool->cntTotalThreads == 0) {
                this->pool->evtAllCompleted.Set();
            }
            this->pool->lockThreadCounters.Unlock();
            this->pool->lockQueue.Unlock();
            delete this;
            return 0;
        }

        /* Get the work item and mark thread as active. */
        ASSERT(!this->pool->queue.IsEmpty());
        WorkItem workItem = this->pool->queue.First();
        this->pool->queue.RemoveFirst();
        this->pool->cntActiveThreads++;

        /* Release locks while working. */
        this->pool->lockThreadCounters.Unlock();
        this->pool->lockQueue.Unlock();

        /* Do the work. */
        VLTRACE(Trace::LEVEL_VL_INFO, "ThreadPool thread [%u] is working ...\n",
            Thread::CurrentID());
        ASSERT((workItem.runnable != NULL) 
            || (workItem.runnableFunction != NULL));
        DWORD exitCode = (workItem.runnable != NULL)
            ? workItem.runnable->Run(workItem.userData)
            : workItem.runnableFunction(workItem.userData);
        VLTRACE(Trace::LEVEL_VL_INFO, "ThreadPool thread [%u] completed work "
            "item with exit code %u\n", Thread::CurrentID(), exitCode);

        this->pool->fireUserWorkItemCompleted(workItem, exitCode);

        /* Mark the thread as inactive and signal event if necessary. */
        this->pool->lockQueue.Lock();
        this->pool->lockThreadCounters.Lock();
        if ((--this->pool->cntActiveThreads == 0)   // SFX. Must be first!
                && this->pool->queue.IsEmpty()) {
            this->pool->evtAllCompleted.Set();
        }
        this->pool->lockThreadCounters.Unlock();
        this->pool->lockQueue.Unlock();
    }
}
开发者ID:,项目名称:,代码行数:71,代码来源:


注:本文中的WorkItem::runnableFunction方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。