Как выполнить асинхронное межпотоковое взаимодействие на платформе с помощью pthreads - PullRequest
1 голос
/ 16 мая 2009

Например, в Windows есть MsgWaitForMultipleObjects, который позволяет асинхронно ожидать сообщений Windows, событий сокета, асинхронного ввода-вывода (IOCompletionRoutine) и дескрипторов мьютекса.

В Unix у вас есть выбор / опрос, который дает вам все, кроме возможности взломать, когда разблокирован какой-то pthread_mutex.

История:

У меня есть приложение, которое имеет основной поток, который делает что-то с несколькими сокетами, каналами или файлами. Теперь время от времени появляется побочное задание (транзакция БД), которое может занимать больше времени, и, если оно выполняется синхронно в основном потоке, нарушает нормальное обслуживание сокетов. Поэтому я хочу сделать операцию DB в отдельном потоке. Этот поток будет ждать некоторого мьютекса во время простоя, пока основной поток не решит дать ему какую-то работу и разблокирует мьютекс, чтобы поток дБ мог его захватить. Проблема в том, как поток базы данных может уведомить главный поток о том, что он завершил работу. Основной поток должен обрабатывать сокеты, поэтому он не может позволить себе спать в pthread_mutex_lock. Периодическое выполнение pthread_mutex_trylock - последнее, что я хотел бы сделать. В настоящее время я рассматриваю возможность использования трубы, но лучше ли это?

Ответы [ 2 ]

1 голос
/ 16 мая 2009

Хорошей идеей здесь является использование трубы. Убедитесь, что ни у какого другого процесса конец записи канала не открыт, а затем выберите () или poll () в главном потоке конец чтения для чтения. Как только ваш рабочий поток завершит работу, закройте () конец записи. Функция select () в главном потоке немедленно активируется.

Я не думаю, что ожидание мьютекса и чего-то еще будет возможно, потому что в Linux мьютексы реализованы с помощью системного вызова futex (2), который не поддерживает файловые дескрипторы.

0 голосов
/ 16 мая 2009

Я не знаю, насколько хорошо это относится к вашей конкретной проблеме, но у posix есть очереди сообщений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...