Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions Modules/Core/Common/include/itkPoolMultiThreader.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,14 @@ class ITKCommon_EXPORT PoolMultiThreader : public MultiThreaderBase
void
SetMaximumNumberOfThreads(ThreadIdType numberOfThreads) override;

struct ThreadPoolInfoStruct : WorkUnitInfo
#ifndef ITK_FUTURE_LEGACY_REMOVE
struct ITK_FUTURE_DEPRECATED(
"PoolMultiThreader now uses a slightly different private `InternalWorkUnitInfo` struct instead!")
ThreadPoolInfoStruct : WorkUnitInfo
{
std::future<ITK_THREAD_RETURN_TYPE> Future;
};
#endif

protected:
PoolMultiThreader();
Expand All @@ -107,13 +111,18 @@ class ITKCommon_EXPORT PoolMultiThreader : public MultiThreaderBase
PrintSelf(std::ostream & os, Indent indent) const override;

private:
struct InternalWorkUnitInfo : WorkUnitInfo
{
std::future<void> Future;
};

// Thread pool instance and factory
ThreadPool::Pointer m_ThreadPool{};

/** An array of work unit information containing a work unit id
* (0, 1, 2, .. ITK_MAX_THREADS-1), work unit count, and a pointer
* to void so that user data can be passed to each thread. */
ThreadPoolInfoStruct m_ThreadInfoArray[ITK_MAX_THREADS]{};
InternalWorkUnitInfo m_ThreadInfoArray[ITK_MAX_THREADS]{};

/** Friends of Multithreader.
* ProcessObject is a friend so that it can call PrintSelf() on its
Expand Down
12 changes: 4 additions & 8 deletions Modules/Core/Common/src/itkPoolMultiThreader.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,8 @@ PoolMultiThreader::SingleMethodExecute()
{
m_ThreadInfoArray[threadLoop].UserData = m_SingleData;
m_ThreadInfoArray[threadLoop].NumberOfWorkUnits = m_NumberOfWorkUnits;
m_ThreadInfoArray[threadLoop].Future = m_ThreadPool->AddWork(m_SingleMethod, &m_ThreadInfoArray[threadLoop]);
m_ThreadInfoArray[threadLoop].Future = m_ThreadPool->AddWork(
[method = m_SingleMethod, threadInfo = &m_ThreadInfoArray[threadLoop]] { method(threadInfo); });
Comment thread
dzenanz marked this conversation as resolved.
}

// Now, the parent thread calls this->SingleMethod() itself
Expand Down Expand Up @@ -175,8 +176,6 @@ PoolMultiThreader::ParallelizeArray(SizeValueType firstIndex,
{
aFunc(ii);
}
// make this lambda have the same signature as m_SingleMethod
return ITK_THREAD_RETURN_DEFAULT_VALUE;
};

SizeValueType workUnit = 1;
Expand Down Expand Up @@ -265,11 +264,8 @@ PoolMultiThreader::ParallelizeImageRegion(unsigned int dimension,
total = splitter->GetSplit(i, splitCount, iRegion);
if (i < total)
{
m_ThreadInfoArray[i].Future = m_ThreadPool->AddWork([funcP, iRegion]() {
funcP(&iRegion.GetIndex()[0], &iRegion.GetSize()[0]);
// make this lambda have the same signature as m_SingleMethod
return ITK_THREAD_RETURN_DEFAULT_VALUE;
});
m_ThreadInfoArray[i].Future =
m_ThreadPool->AddWork([funcP, iRegion]() { funcP(&iRegion.GetIndex()[0], &iRegion.GetSize()[0]); });
}
else
{
Expand Down