Поддерживает ли OmnithreadLibrary "кражу работы"?
Кража работ, например, доступна в среде Fork / Join на платформе Java. (См. Чем инфраструктура fork/join лучше, чем пул потоков?) - возможно ли нечто подобное с OmniThreadLibrary?
Воровство работы: рабочие потоки, у которых заканчиваются дела, могут украсть задачи из других потоков, которые все еще заняты.
1 ответ
Я не знаю, назову ли я эту технику "кражей работы", но действительно OmniThreadLibrary поддерживает все ваши ядра занятыми при выполнении абстракции Fork/Join.
Когда вы используете Fork/Join, вы отправляете задачу в пул вычислений, вызывая Compute
, Когда вы звоните Value
чтобы получить результат подкомпьютера или Await
ждать завершения подсчета, и подсчет еще не завершил свою работу, Value
/Await
возьмет другую задачу из пула вычислений и выполнит ее. Когда эта новая задача завершена, она снова проверит, завершила ли подкомпьютер свою работу и, если нет, обработает следующую подзадачу.
Этот механизм более подробно описан в вики OmniThreadLibrary.
РЕДАКТИРОВАТЬ
Я не думаю, что подход Fork/Join следует называть "воровством работы". В реализации OmniThreadLibrary рабочий элемент никогда не назначается потоку, пока поток не начнет его выполнять. И как только поток начинает его выполнять, никто не сможет его украсть, так как в этом не будет никакой цели.