аналог waitformultipleobjects в linux

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

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

Re: аналог waitformultipleobjects в linux

Сообщение скалогрыз » 13.10.2017 16:45:23

а "объекты" какие нужно ожидать? (из pthread-ов, файлы, сокеты, процессы?)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: аналог waitformultipleobjects в linux

Сообщение ElectroGuard » 14.10.2017 01:37:19

Массив синхронизационных Event'ов. Необходимо их все ожидать.
ElectroGuard
новенький
 
Сообщения: 71
Зарегистрирован: 03.06.2016 12:10:22

Re: аналог waitformultipleobjects в linux

Сообщение скалогрыз » 14.10.2017 02:56:06

ElectroGuard писал(а):Массив синхронизационных Event'ов. Необходимо их все ожидать.

я так думаю, что придётся писать чуть больше, чем написано в RTLEvent-ах.
глядя на текущую реализацию FPC RTLEvent-а, видно, что он сделан через pthread mutex и pmutex condition.

SetEvent() посылает pthread_cond_signal() на один cond, связанный с этим евентом.

Очевидно, что реализацию необходимо расширить до списка cond.
Т.е.
WaitForMulitpleObjects() (с поправкой на то, что в него будут переданы только event-ы)
должен создать ещё один cond и добавить его в очередь к каждому event-у, которые ожидаются.

Соответственно, любой из ожидающий евентов, может дать сигнал этму cond.
После чего WaitForMultipleObjects - должна выяснить, какой из евентов просигналил (ну чтобы был разумный результат)
и убрать дополнительные cond-ы с очередей всех других евентов.

Вот и всё. Эффективность максимальная. Циклов проверки состояния нет.
---
Если я не ошибаюсь, то эту систему можно прикрутить к RTL в runtime-е, написав свой вариант cthreads-ов.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: аналог waitformultipleobjects в linux

Сообщение wadman » 16.10.2017 11:28:29

скалогрыз писал(а):Соответственно, любой из ожидающий евентов, может дать сигнал этму cond.
После чего WaitForMultipleObjects - должна выяснить, какой из евентов просигналил (ну чтобы был разумный результат)
и убрать дополнительные cond-ы с очередей всех других евентов.

Вот и всё. Эффективность максимальная. Циклов проверки состояния нет.

Согласен, красивое решение. При необходимости так и сделаю у себя. :)

Добавлено спустя 6 часов 22 минуты 58 секунд:
скалогрыз писал(а):Вот и всё. Эффективность максимальная. Циклов проверки состояния нет.

Покрутил код и получается так, что таким образом (без опросов) можно ловить ивенты, выставленные ручным способом (своим кодом).
Если нужно ждать событие от ОС (окончание операции ввода/вывода), то придется все равно периодически опрашивать циклом. Увы.
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

Re: аналог waitformultipleobjects в linux

Сообщение скалогрыз » 16.10.2017 20:18:56

wadman писал(а):Если нужно ждать событие от ОС (окончание операции ввода/вывода), то придется все равно периодически опрашивать циклом. Увы.

операции ввода/вывода не совпадают с тех заданием:
ElectroGuard писал(а):Массив синхронизационных Event'ов. Необходимо их все ожидать.

;)

WaitForMultipleObjects - это же очень хитрая операция, завязанная на особенностях реализации ядра Windows.
Хитрость в том, что "объекты" могут быть разношорстными по своей природе.
По-этому очень важно оговаривать какие "объекты" нужно ожидать. (Т.к. если нужна подзадача, то возможно она уже решена, cм пост Sergei I. Gorelkin про poll и select)

В тех случаях когда нужно решать задачу, в которой придёться ожидать некий салат из объектов (ожидать нужно и евенты и файлы, и ещё что-нибудь),
тогда придёться создавать дополнительные объекты синхронизации.

Какой-нить pipe.
Сначала будет инициолизирован дополнительный cond, и добавлен для каждого евернта.
Потом нужно собрать все файл дескрипторы, которые нужно ожидать + дополнительный pipe.
Все эти дескрипторы будут ожидаться через poll()

В том случае, если ивенту дан сигнал, то кроме прочего, этот ивент должен будет записать что-нить через pipe.
Именно эта запись через pipe - "разморозит" ожидающий события poll()
а индикация того, что разморозился именно дополнительный pipe - даст знать, что событие произошло в ивентах.

дополнительная писанина, конечно, и расход файловых дескрипторов, зато будет работать.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: аналог waitformultipleobjects в linux

Сообщение wadman » 19.10.2017 12:18:27

скалогрыз писал(а):операции ввода/вывода не совпадают с тех заданием:

В общем-то для себя реализовал. :) с ИО операциями не стал пока прикручивать...
Для синхронизации своих потоков отлично подходит. За идею спасибо.
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

Пред.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru
cron