синхронизация между потоками, обрабатывающими чтение и запись в сокетах с бесконечными циклами - PullRequest
0 голосов
/ 25 февраля 2019

Я выполняю задачу для получения ввода пользователя в одном потоке (поток 1) и другом потоке (поток 2) для отправки циклических сообщений CAN в среде linux.Программа работает следующим образом:

  1. В главном потоке создан сокет, использующий socket(AF_INET,SOCK_STREAM,0) для TCP-соединения сервер-клиент
  2. Привязка успешно выполнена.
  3. Используя accept(), сервер-клиент установлен
  4. После 3) создаются два потока, thread1 и thread2
  5. thread 1 для ввода пользователя из recv(), http://man7.org/linux/man-pages/man2/recv.2.html
  6. поток 2 создал сокет для связи CAN с использованием сокета и использует таймер для непрерывной отправки сообщений CAN с указанным интервалом.

Inthread2, я использовал timer_create для отправки циклических сообщений, который использует функцию write для записи сообщений CAN в разъем CAN .http://man7.org/linux/man-pages/man2/timer_create.2.html

Проблема в том, что у меня recv в бесконечном цикле в thread1, ожидающем ввода пользователя, и функция таймера в thread2 также непрерывна.Это заставляет recv выйти с прерыванием сигнала EINTR от thread1.Я пробовал следующее,

  • Создал условное ожидание, используя pthread_cond_wait в потоке 1, чтобы ожидать обновления состояния из потока 2. Это не работает, так как после запуска таймера это делаетбольше не проверять переменную условия.

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

...