Поддерживает ли OmnithreadLibrary "кражу работы"?

Кража работ, например, доступна в среде Fork / Join на платформе Java. (См. Чем инфраструктура fork/join лучше, чем пул потоков?) - возможно ли нечто подобное с OmniThreadLibrary?


Воровство работы: рабочие потоки, у которых заканчиваются дела, могут украсть задачи из других потоков, которые все еще заняты.

1 ответ

Решение

Я не знаю, назову ли я эту технику "кражей работы", но действительно OmniThreadLibrary поддерживает все ваши ядра занятыми при выполнении абстракции Fork/Join.

Когда вы используете Fork/Join, вы отправляете задачу в пул вычислений, вызывая Compute, Когда вы звоните Value чтобы получить результат подкомпьютера или Await ждать завершения подсчета, и подсчет еще не завершил свою работу, Value/Await возьмет другую задачу из пула вычислений и выполнит ее. Когда эта новая задача завершена, она снова проверит, завершила ли подкомпьютер свою работу и, если нет, обработает следующую подзадачу.

Этот механизм более подробно описан в вики OmniThreadLibrary.


РЕДАКТИРОВАТЬ

Я не думаю, что подход Fork/Join следует называть "воровством работы". В реализации OmniThreadLibrary рабочий элемент никогда не назначается потоку, пока поток не начнет его выполнять. И как только поток начинает его выполнять, никто не сможет его украсть, так как в этом не будет никакой цели.

Другие вопросы по тегам