Я работаю над сетевым проектом на C / C ++ и испытываю трудности с синхронизацией / сигнализацией своих потоков.Вот что я пытаюсь выполнить:
- Опрос группы сокетов с помощью функции poll
- Если какие-либо сокеты готовы из события POLLIN, то отправьте сигнал потоку читателяи поток писателя для «пробуждения»
У меня есть класс MessageHandler, который устанавливает маску сигналов и порождает потоки читателя и писателя.Внутри них я жду сигнала (-ов), который должен их разбудить.
Проблема в том, что я проверяю все эти функции, отправляя сигнал потоку, но он никогда не просыпается.
Вот код проблемы с дальнейшим объяснением.Заметьте, что я только что подчеркнул, как он работает с потоком чтения, поскольку поток записи по сути тот же.тот факт, что поток запускается правильно и переходит к вызову sigwait.
Ошибка может быть очевидной (это не синтаксическая ошибка - приведенный выше код сжат из компилируемого кода, и я мог бы испортить его при редактировании)но я просто не могу найти / увидеть это, так как потратил много времени на эту проблему и запутался.
Позвольте мне объяснить, что я думаю, и если это имеет смысл.
- После создания объекта типа MessageHandler он установит для allowSignalsMask значение одного сигнала (на данный момент), который я заинтересован в использовании для пробуждения моих потоков.
- Iдобавьте сигнал к заблокированным сигналам текущего потока с помощью pthread_sigmask.Все остальные потоки, созданные после этой точки, должны теперь иметь одинаковую маску сигналов.
- Затем я создаю поток чтения с помощью pthread_create, где arg - указатель на объект типа MessageHandler.
- Я вызываюспать как дешевый способ убедиться, что мой readerThread выполняется до sigwait ()
- Я посылаю сигнал SIGCONT на reader, считывая, что меня интересует sigwait, чтобы разбудить / разблокировать после его получения.
- Снова я называю сон дешевым способом гарантировать, что мой readerThread может выполнить все время после того, как он проснулся / разблокирован от sigwait ()
Другие полезные заметки, которые могут быть полезны, но я неНе думаю, что повлиять на проблему:
- MessageHandler создается, а затем создается другой поток, учитывая указатель функции, который указывает на запуск.Этот поток будет отвечать за создание потоков чтения и записи, опроса сокетов с помощью функции poll, а затем, возможно, отправки сигналов в потоки чтения и записи.
Я знаю, что это длинный пост, ноСпасибо, что прочитали его и любую помощь, которую вы можете предложить.Если я не был достаточно ясен или вы чувствуете, что я не предоставил достаточно информации, пожалуйста, дайте мне знать, и я исправлю сообщение.
Еще раз спасибо.