Трудно сказать, в чем заключается основная проблема в вашем случае, но, скорее всего, это не то, что можно исправить с помощью вызова sched_yield()
или pthread_yield()
. Единственное четко определенное использование для выдачи в Linux - это позволить другому готовому потоку выгружать текущий текущий связанный с ЦП поток с тем же приоритетом на том же ЦПУ в соответствии с политикой планирования SCHED_FIFO. Что является плохим дизайнерским решением почти во всех случаях.
Если вы серьезно относитесь к своей цели «пытаться работать в режиме реального времени» в Linux, то, прежде всего, вам следует использовать настройку sched_setscheduler
в реальном времени (SCHED_FIFO или SCHED_RR, предпочтительно FIFO).
Во-вторых, получите полный пакет исправлений для Linux (с kernel.org , если ваш дистрибутив не предоставляет его. Он также даст вам возможность перепланировать потоки драйвера устройства и выполнить ваш поток выше, скажем, потоки жесткого диска или драйвера Ethernet.
В-третьих, см. RTWiki и другие ресурсы для получения дополнительных советов о том, как разрабатывать и настраивать приложения реального времени.
Этого должно быть достаточно, чтобы получить время отклика менее 10 микро секунд, независимо от загрузки системы в любой приличной настольной системе. У меня есть встроенная система, в которой я выживаю только 60 с лишним ответов и 150 при высокой нагрузке на диск / систему, но она все равно на несколько порядков быстрее, чем вы описываете.