Гость Опубликовано 13 июня, 2004 Жалоба Поделиться Опубликовано 13 июня, 2004 Народ!!! Помогите! Перевожу прогу с винды - там есть Event-ы, то бишь SetEvent(), ResetEvent() и в паре с ними WaitSingleObject(). Часть из них легко заменилась мьтексами: pthread_mutex_lock - unlock. А часть нужно всё же устанавливать из других потоков, тобишь выводить из ожидания определённую функцию из другого потока. Тут как раз бы event-ы и как нельзя кстати были бы. А вроде как тюти (man -k event). Подскажите что туды пихать. И вообще кроме мьютексов и иже с ними функций что ещё есть? Какие-нибудь wait-функции... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 13 июня, 2004 Жалоба Поделиться Опубликовано 13 июня, 2004 В Linux более-менее эквивалентом являются т.н. condition variables. Или семафоры. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 14 июня, 2004 Жалоба Поделиться Опубликовано 14 июня, 2004 Спасибо! с condition проблема решится. Но всё же как-то маловато синхронизирующих объектов. По сути condition-ы это лишь надстройка над мьютексами. А мьютексы - это симафоры. Я чую, что в этом есть какой-то полезный смысл , но понять не могу... В той же винде побольше объектиков. Хотя по части удобства программирования Линукс всегда опережает. Что-то тут не чисто... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 14 июня, 2004 Жалоба Поделиться Опубликовано 14 июня, 2004 Стоп! condition variables -- это не надстройка над мьютексами. Точно также как и eventы в Win32 -- это не надстройка над мьютексами. А мьютексы -- это не семафоры. Разумеется, одно через другое в принципе реализуемо, но вообще-то это все разные вещи и для разных целей предназначенные. А кроме того, есть еще read/write locks и barriers, аналогов которым в Винде, насколько я помню, нет. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 15 июня, 2004 Жалоба Поделиться Опубликовано 15 июня, 2004 Ну как же? Ведь pthread_cond_wait(&mutex,&cond); Хотя вы конечно правы - они скорее просто используют их (для доступа к cond как я понял). Про мьютексы и симофоры я попутал - извеняюсь! А ещё про объекты - спасибо! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 18 июня, 2004 Жалоба Поделиться Опубликовано 18 июня, 2004 Я тоже недавно начал програмить под ЛИНУКС, и тоже столкнулся с проблемами реализации некоторых схем синхронизации. Например: У меня есть поток который ждет прихода некоторых даных с последовательного порта и плюс выполняет функции отсылки туда данных. Есть три вида событий который ждет поток 1. Пришли данные на порт 2. Установлен Event, который означает что надо обработать вызов функции передачи пакета в порт. 3. Установлен Event, завершения рабочего цикла потока, он выходит из цикла рассылает информацию, о том что закрываеться и выходит. в Винде я пользовался функцией WaitForMultipleObjects для ожидания данных с порта я открывал порт в неблокируемом режиме и вызывал функцию чтения в OVERLAPPED режиме и связивал с операцией Event, которого и ждал потом в групе с отсальными двумя. Как нужно более правильно реализовывать данную задачу по ОС ЛИНУКС. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июня, 2004 Жалоба Поделиться Опубликовано 21 июня, 2004 Проще всего использовать два треда -- один для чтения, другой для записи. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 22 июня, 2004 Жалоба Поделиться Опубликовано 22 июня, 2004 А как ждать команды о том что нужно завершать работу данного потока, и ждать данных с компорта. Подобных потоков в задаче много для каждого порта свой? И что в вашем понимании тред - поток, или нет? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 23 июня, 2004 Жалоба Поделиться Опубликовано 23 июня, 2004 А не нужно ждать команды. Нужно поток прибивать с помощью pthread_cancel, а обработку завершения делать в cancellation handler. Тред для приема может быть один на все порты (man select) Тред на передачу тоже может быть один, хотя для передачи проще сделать тред на каждый порт. Тред в моем понимании -- это thread. Что можно переводить как "поток", но это порождает двусмысленности. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 22 июля, 2004 Жалоба Поделиться Опубликовано 22 июля, 2004 Вместо WaitForMultipleObjects нужно использовать select(),вместо WaitEvent можно использовать алярмы или установить свои обрабочики сигналов. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 22 июля, 2004 Жалоба Поделиться Опубликовано 22 июля, 2004 Ну с "обрабочики сигналов" понятно что такое, а вот что такое "алярмы" не понятно. Разъясните пожайлуста Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.