Как получить долгую ветку ожидания в Intel TBB?

Я хочу создать поток или задачу (более одной, если быть точным), которая выполняется и выполняет некоторую работу без использования процессора, которая займет много времени из-за внешних причин, таких как запрос HTTP или операция ввода-вывода файла с медленного диска , Я мог бы сделать это с помощью асинхронного ожидания в C # и будет именно то, что я пытаюсь сделать здесь. Создайте поток или задачу и позвольте ей делать свое дело, пока я продолжаю выполнение программы и просто позволяю ей возвращать результат всякий раз, когда будет готов. Проблема с TBB, которую я имею, состоит в том, что все задачи, которые я могу сделать, думают, что они созданы для работы с интенсивным использованием CPU.

Что TBB называет GUI Thread, что я хочу в этом случае? Мне нужно больше, чем один, это возможно? Можете ли вы указать мне правильное направление? Должен ли я искать другую библиотеку, которая обеспечивает многопоточность и доступна для нескольких ОС?

2

Решение

Любое действие по блокировке ввода / вывода плохо моделируется задачей — поскольку задачи предназначены для выполнения до конца, это просто не то, для чего предназначены задачи. Вы не найдете никакого подхода, основанного на задачах TBB, который обходит это. Поскольку то, что вы хотите, это поток, и вы хотите, чтобы он работал более или менее хорошо с другим кодом TBB, который у вас уже есть, просто используйте Нативный класс TBB решить проблему так же, как и с любым другим API потоков. Вам не нужно устанавливать приоритет или что-либо еще в этом потоке, управляемом TBB, потому что он доберется до своего блокирующего вызова и затем не займет больше времени, пока ресурс не станет доступным.

2

Другие решения

Единственное, о чем я могу думать конкретно в TBB, — это то, что задаче может быть назначен приоритет. Но это не то же самое, что приоритет потока. Приоритеты задач TBB только диктуют когда Задача будет выбрана из готового пула, но, как вы сказали, когда задача будет выполнена, ожидается, что она будет усердно работать. Чтобы решить эту проблему, вы можете разбить свою работу ввода-вывода на сегменты, а затем отправить их в рабочий пул в виде серии (зависимых) задач с низким приоритетом. Но я не думаю, что это доходит до твоей настоящей проблемы …

Упомянутый вами поток графического интерфейса — это шаблон в документе шаблонов TBB, в котором говорится, как разгрузить задачу, а затем дождаться обратного вызова, чтобы сообщить о ее завершении. Это не совсем отличается от асинхронного. Я не думаю, что это решит и вашу проблему.

Я думаю, что лучший способ для вас — создать поток на уровне ОС. Это потоки в Linux или потоки Windows в Windows. Тогда вы захотите позвонить по этому поводу: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686277(v=vs.85).aspx … если вы оказались в C ++ 11, вы можете использовать std :: thread для создания потока и затем вызвать thread :: native_handle, чтобы получить дескриптор для вызова API Windows для установки приоритета.

1

По вопросам рекламы [email protected]