аналог waitformultipleobjects в linux

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ElectroGuard
новенький
Сообщения: 71
Зарегистрирован: 03.06.2016 11:10:22

аналог waitformultipleobjects в linux

Сообщение ElectroGuard »

доброго всем дня. скажите - существует ли какой-то аналог (либо эмуляция его работы на fpc) waitformultipleobjects в linux (ubunta)?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Примерным аналогом являются fpselect или fppoll.
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

TEvent, TEventObject (из syncobjs)
или
RTLEventCreate, RTLEventWaitFor, итд..
heX
новенький
Сообщения: 12
Зарегистрирован: 19.02.2016 16:20:32

Сообщение heX »

RTLEventWaitFor это аналог WaitForSingleObject.
А вот аналога WaitForMultipleObjects нет (просмотрел threadh.inc и syncobjs), но его легко эмулировать циклом и в теории быстродействие будет не особо хуже.
ElectroGuard
новенький
Сообщения: 71
Зарегистрирован: 03.06.2016 11:10:22

Сообщение ElectroGuard »

Проблема, к сожалению, до сих пор надёжно не решена. Циклы и прочее - не совсем то. А точнее - совсем не то. Хорошего решения я пока так и не нашел.
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

heX писал(а):но его легко эмулировать циклом

Не легко. Либо не точно по времени срабатывания, либо с тормозами.
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

ElectroGuard писал(а):Циклы и прочее - не совсем то.

wadman писал(а):Либо не точно по времени срабатывания, либо с тормозами.

Это вы предполагаете или имеете опыт?

WaitForSingleObject() при разрешающем семафоре проскакивает без задержки, а при запрещающем один хрен будет стоять до разрешающего сигнала или таймаута. Если один из нескольких WaitForSingleObject() вернет WAIT_TIMEOUT, то остальные не обязательно проверять. Где тут неточность или тормоза?
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Код: Выделить всё

windows.h
#if _WIN32_WINNT <= _WIN32_WINNT_WIN7
#define MAXIMUM_WAIT_OBJECTS 64
#else
#define MAXIMUM_WAIT_OBJECTS 128
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

serbod писал(а):Это вы предполагаете или имеете опыт?

Опыт.

Если постоянно дергать ожидаемые объекты без перерыва, то это нагрузка на ядро.
Если давать потоку отдохнуть между опросами состояний, то это неточность.
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

wadman писал(а):Если постоянно дергать ожидаемые объекты без перерыва, то это нагрузка на ядро.

Что значит дергать ожидаемые объекты? Есть готовая функция проверки семафора WaitForSingleObject(), которая ничего не дергает и не нагружает. WaitForMultipleObjects() это то же самое, только проверяется не один семафор, а несколько по списку.

Если нужна real-time точность (наносекунды), то такие задачи лучше выполнять на отдельных микроконтроллерах или ASIC, а основной комп использовать для управления и хранения данных. Как в дисковых, сетевых, аудио и видео контроллерах, которые самостоятельно используют часть общей памяти когда им нужно, а не когда это нужно операционной системе.
ElectroGuard
новенький
Сообщения: 71
Зарегистрирован: 03.06.2016 11:10:22

Сообщение ElectroGuard »

Не только точность нужна, но и нагрузка на ядро = 0, как в винде. Там же как-то работает. Без отдельного микрокотнроллера, на этом же железе )
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

serbod писал(а):Что значит дергать ожидаемые объекты?

Встречный вопрос: была хоть одна попытка реализовать?
Можно начать с простого: в цикле дергать пустую функцию и смотреть на нагрузку на ядро. Потом тоже самое, но со слипом или маленьким таймаутом.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

https://www.youtube.com/watch?v=SIZmLPtcZiE
- там намного сложнее..
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

wadman писал(а):Встречный вопрос: была хоть одна попытка реализовать?

Конечно. Специально еще раз проверил, Ubuntu Linux 14.04 LTS x64, под VirtualBox 5.1.26 запущенной на Windows 7 x64, комп i3-4170 3.70 GHz / 8Gb
Lazarus 1.9 FPC 3.1.1

Код: Выделить всё

Event.ResetEvent();
Event.WaitFor(10000);

при ожидании сигнала загрузка процессора 0.0%

Код: Выделить всё

Event.SetEvent();
for i := 1 to 10000000 do Event.WaitFor(10000); // 10 миллионов циклов

3.785 секунд или 2 642 008 циклов в секунду.
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

serbod писал(а):Конечно.

А я о чем писал? Либо тормознутость, либо неточность. Неточность воспроизведена, осталось "угадать" вариант с тормознутостью: viewtopic.php?t=11435&view=unread#p126097
Ответить