LINUX.ORG.RU

pthreads: ожидание нескольких семафоров


0

0

В винде есть функа WaitForMultipleObjects, принимает массив объектов и ждет одного из них или всех сразу. Есть ли в линуксе что-нибудь подобное? Или, может быть, кто-то занимался такими вещами? Прошу сильно не бить, если я что-то не то говорю, - я искал в доках, но что-то ничего не нашел. А занимаюсь тредами совсем недавно. Заранее всем большое спасибо.


аналог WaitForMultipleObjects имхо select

А про использование симофоров, лучше почитай или посмотри примеры программ, скорее всего не правильно их используешь. Ни разу не было ситуации когда надо ждать несколько симофороф. (хотя в теории такие проблемы рассмитриваются)

Симофоры использовал в 2-х ситуациях: для использования каго-го общего ресурса и для ожидания (нескольких процесов) поступления данных для обработки.

anonymous
()

угу, спасибо. а семафоры в моем случае используются в качестве индикаторов событий (типа булевые).

JekLove
() автор топика

Елки-палки, что-то я придумать ничего путного не могу :) Может, кто-нибудь сможет помочь... Проблема такая: есть массив бинарных семафоров, реализованных с помощью pthread_mutex_t и pthread_cond_t. Необходимо заставить текущий тред дождаться разблокировки хотя бы одного из них. Как бы это можно хорошо сделать в Линуксе? Заранее спасибо за советы.

JekLove
() автор топика

pthread_barrier - поможет?

Удачи!

tvn
()

Не-а... Ведь это же для синхронизации нескольких тредов, насколько я понимаю.... А у меня как бы наоборот - одновременное наблюдение за несколькими событиями, которые говорят о поведении каких-то там левых неизвестных нам тредов.

Я вот думаю, такое решение: взять и создать столько тредов, сколько семафоров, каждый из них заставить ожидать свой соответствующий ему семафор, а по разблокировке оного разблокировать один и тот же глобальный булевый семафор, за которым будет наблюдать вызывающий тред. А?.. Кто общался с pthreads, ваше мнение, - не будет ли такая схема медленной/ресурсоемкой?

JekLove
() автор топика
Ответ на: комментарий от JekLove

А чем тебя select() poll()) не устраивает? Почему обязательно семафоры?

IMHO select() как раз и придуман для таких целей, а семафоры - они для другого

Die-Hard ★★★★★
()

Ну... Во-первых, у меня имеется уже почти написанный модуль, вот его нужно немножко доделать, в частности, реализовать функцию, которая ведет себя так, как я описал, причем структуры типа булевых семафоров и функции для работы с ними уже имеются.

Вот, а насчет select(), poll()... они же работают с файловыми дескрипторами, насколько я понимаю. Ну а если файлы вообще не при чем, то тогда как быть?

JekLove
() автор топика
Ответ на: комментарий от JekLove

> почти написанный модуль, вот его нужно немножко доделать,
:)
Мне понравилось слово "немножко".
Наверное, то, как как ты сам описАл, и есть в таком случае единственный выход.
Несколько черезодноместо, не находишь?

> если файлы вообще не при чем, то тогда как быть?
pipe() спасет.
Я так делаю: открываю кучу пайпов, и при наступлении событий бросаю туда
нечто (зависит от, иногда - просто символ '\n'), а другие концы пайпов
сосет select.


Die-Hard ★★★★★
()

Там есть вроде как какая-то функция, помню когда разбирался то ее встречал. Посмотри ALP.

Я эту функцию потом только нашел. Я обошелся так:

Есть массив с мьютексами, которые необходимо ждать на освобождение. Делаем один добавочный мьютекс. При разблокировке некоторого мьютекса из массива, освобождаем также и добавочный мьютекс.

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

Как только он разблокировался, пробегаем по всему массиву мьютексов и определяем какой из них разблокирован.

Сорри за возможно кривое объяснение. Но может оно тебе поможет

Dead ★★★★
()

Для нескольких я делал так:

Создавал один семафор с такими свойствами:
0-заблокировал и ждем
>0 уменьшает на 1 и дальше выполняется процесс.

Инициализация, соотвественно, 0

Создаю кучу порцессов и они вешаются на один этот семафор.
В главном процессе при поступлении данных кидаю их в очередь и увеличиваю семафор, т.е. разблокировываю.

Первый попавшийся процесс срабатывает (приэтом семафор опять ==0) и заберает данные их очереди для обработки.

Соотвественно работа с очередью велась с использованием другого семафора.

Может тебе это поможет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.