本文整理汇总了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();
}
}