Перейти к содержанию

Аналог Event под Линукс?


Рекомендуемые сообщения

Народ!!! Помогите! Перевожу прогу с винды - там есть Event-ы, то бишь SetEvent(), ResetEvent() и в паре с ними WaitSingleObject(). Часть из них легко заменилась мьтексами: pthread_mutex_lock - unlock. А часть нужно всё же устанавливать из других потоков, тобишь выводить из ожидания определённую функцию из другого потока. Тут как раз бы event-ы и как нельзя кстати были бы. А вроде как тюти (man -k event). Подскажите что туды пихать. И вообще кроме мьютексов и иже с ними функций что ещё есть? Какие-нибудь wait-функции... Smile

Ссылка на комментарий
Поделиться на другие сайты

Спасибо! с condition проблема решится. Но всё же как-то маловато синхронизирующих объектов. По сути condition-ы это лишь надстройка над мьютексами. А мьютексы - это симафоры. Я чую, что в этом есть какой-то полезный смысл Smile, но понять не могу... В той же винде побольше объектиков. Хотя по части удобства программирования Линукс всегда опережает. Что-то тут не чисто... Smile

Ссылка на комментарий
Поделиться на другие сайты

Стоп! condition variables -- это не надстройка над мьютексами.

Точно также как и eventы в Win32 -- это не надстройка над мьютексами. А мьютексы -- это не семафоры. Разумеется, одно через

другое в принципе реализуемо, но вообще-то это все разные вещи

и для разных целей предназначенные. А кроме того, есть еще

read/write locks и barriers, аналогов которым в Винде, насколько

я помню, нет.

Ссылка на комментарий
Поделиться на другие сайты

Ну как же? Ведь pthread_cond_wait(&mutex,&cond); Хотя вы конечно правы - они скорее просто используют их (для доступа к cond как я понял). Про мьютексы и симофоры я попутал - извеняюсь! А ещё про объекты - спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Я тоже недавно начал програмить под ЛИНУКС, и тоже столкнулся с проблемами реализации некоторых схем синхронизации.

Например:

У меня есть поток который ждет прихода некоторых даных с последовательного порта и плюс выполняет функции отсылки туда данных.

Есть три вида событий который ждет поток

1. Пришли данные на порт

2. Установлен Event, который означает что надо обработать вызов функции передачи пакета в порт.

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

в Винде я пользовался функцией WaitForMultipleObjects

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

Как нужно более правильно реализовывать данную задачу по ОС ЛИНУКС.

Ссылка на комментарий
Поделиться на другие сайты

А как ждать команды о том что нужно завершать работу данного потока, и ждать данных с компорта. Подобных потоков в задаче много для каждого порта свой? И что в вашем понимании тред - поток, или нет?

Ссылка на комментарий
Поделиться на другие сайты

А не нужно ждать команды. Нужно поток прибивать с помощью

pthread_cancel, а обработку завершения делать в cancellation

handler.

Тред для приема может быть один на все порты (man select)

Тред на передачу тоже может быть один, хотя для передачи проще

сделать тред на каждый порт.

Тред в моем понимании -- это thread. Что можно переводить как

"поток", но это порождает двусмысленности.

Ссылка на комментарий
Поделиться на другие сайты

  • 5 недель спустя...

Вместо WaitForMultipleObjects нужно использовать select(),вместо WaitEvent можно использовать алярмы или установить свои обрабочики сигналов.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

Загрузка...
×
×
  • Создать...