No sé si llamaría a esta técnica "robo de trabajo" pero, de hecho, OmniThreadLibrary mantiene todos sus núcleos ocupados cuando ejecuta Fork/Join abstraction.
Cuando utiliza Fork/Join, envía una tarea al grupo de cálculo llamando al Compute
. Cuando llame al Value
para obtener el resultado de la subcomputación o Await
para esperar a que finalice la subcomputación y la subcomputación aún no ha completado su trabajo, Value
/Await
tomará otra tarea del grupo de cálculo y la ejecutará. Cuando finalice esta nueva tarea, nuevamente se verificará si la subcomputación ha completado su trabajo y, si no, procesará la siguiente subtarea.
Este mecanismo se describe con más detalle en el OmniThreadLibrary wiki.
EDITAR
No creo Tenedor/Join enfoque debería llamarse "trabajo robar". En la implementación de OmniThreadLibrary, el elemento de trabajo nunca se asigna a un hilo hasta que el hilo comienza a ejecutarlo. Y una vez que el hilo comienza a ejecutarlo, nadie puede robarlo ya que no habría ningún propósito en eso.
La Unidad OtlParallel tiene mención de esto y también ve esta publicación del blog: http://www.thedelphigeek.com/2011/01/parallel-for-implementation-1-overview.html – Shambhala
Shamballa, este artículo describe el ForEach abstracción, no tenedor/Únete. – gabr
Lo siento mucho, debería haber leído la pregunta más despacio y entendido mejor. – Shambhala