Почему эти потоки расположены в моем приложении OpenDDS? - PullRequest
0 голосов
/ 02 апреля 2020

Я отлаживаю с помощью GDB пример StockQuoterUDPInfoRepo только для понимания того, что происходит под капотом. На самом деле я изменил конфигурацию, чтобы использовать RTPS либо для обнаружения, либо для транспортного протокола.

[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS

[transport/the_rtps_transport]
transport_type=rtps_udp

Отладка издателя , GDB показывает, что выделено 8 потоков (первый один из них является основным потоком).

Мне нужно понять, какова роль каждого потока, поэтому давайте посмотрим, когда они распределяются постепенно.

  1. Основной поток запускается.

  2. Выполнение этой строки , которая касается инициализации DomainParticipant, выделяет новый поток и печатает GDB [New Thread 0x7f76416cd700 (LWP 903)]. GDB info threads печатает следующее: image

Таким образом, номер нити. 2 заблокирован на select () функция системного вызова. Чего ждет эта тема?

участник создания выделяет 4 новых потока. Теперь GDB info threads печатает следующее: image Какова цель этой темы? Из рисунка видно, что потоки 3 и 5 ожидают переменную условия, а потоки 4 и 6 заблокированы на select (). Чего они ждут? Я предполагаю, что один из этих новых потоков (темы № 3-6) - это тот, кто отвечает за периодическую отправку сообщений, чтобы объявить о присутствии участника в сети. Если это так, то должен также присутствовать его «корреспондент-слушатель», то есть поток, отвечающий за обнаружение такого рода сообщений по сети. Не так ли? Однако то, что я только что сказал, объясняет только два из четырех потоков. Как насчет двух оставшихся? В спецификациях DDS и RTPS говорится, что должны быть предусмотрены 4 встроенные темы, и для каждой из них имеются соответствующие устройства чтения и записи данных. устройство чтения / записи данных связано с подписчиком / издателем (в соответствии с требованиями спецификации DDS). Таким образом, два оставшихся потока могут быть этими подписчиком и издателем.

Создание data_writer приложения выделяет 2 новых потока. Теперь GDB info threads печатает следующее: image Для чего нужны эти темы?

Что происходит под капотом? Заранее спасибо.

Вы можете увидеть выпуск github здесь

...