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

потоки, сокеты, selecl()


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

Короче идея гениальна:

Сервер

======

Два потока (POSIX -pthread_*), один заблокирован и ждет accept()-ом новые соединения. Второй заблокирован select()-ом, прослушивая старые. И вот когда приходит новое, 1-ый разблокирует второй, посылая ему сигнал (напр., SIGALRM) и второй выходит из системного вызова select() и добавляет к маске файлов еще один сокет и снова начинает ждать, когда чего-нить придет.

Так вот, с чем я столкнулся:

1) Маски сигналов потоков pthread_sigmask не работают!! когда шлю pthread_kill(поток,..), то поток _поток_ получает заблокированный сигнал!!!!

2) Обработчик вызывается только раз!!!

3) select() не хочет блокироваться (на обычных файлах, только что созданных). Проверял маску только на чтение - не хочет (а ведь файлы пустые!), только на ошибки - не хочет (но ведь ошибок-то нет!!)

4) В одном примере pthread_kill() вообще не работает, а только raise()

Кто делал что-то такое или сталкивался с этим, ПЛИЗ (!!) помогите!!

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

Разобрался, частично. Просто сам с ушами Wink) НО: с select так и не разобрался. И еще:

ПОЧЕМУ НАДО ВСЕ ВРЕМЯ ВЫЗЫВАТЬ sched_yiled() чтобы мог поработать и второй поток, даже с mutex, CV, sem... А на кой тогда шедулер? Без sched_yield() один крутится, сигналит чего-то, мутексируется, а второй даже вклиниться не успевает!!

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

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

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

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

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

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

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

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

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

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