Я отлаживаю с помощью GDB пример StockQuoterUDPInfoRepo только для понимания того, что происходит под капотом. На самом деле я изменил конфигурацию, чтобы использовать RTPS либо для обнаружения, либо для транспортного протокола.
[common]
DCPSGlobalTransportConfig=$file
DCPSDefaultDiscovery=DEFAULT_RTPS
[transport/the_rtps_transport]
transport_type=rtps_udp
Отладка издателя , GDB показывает, что выделено 8 потоков (первый один из них является основным потоком).
Мне нужно понять, какова роль каждого потока, поэтому давайте посмотрим, когда они распределяются постепенно.
Основной поток запускается.
Выполнение этой строки , которая касается инициализации DomainParticipant, выделяет новый поток и печатает GDB [New Thread 0x7f76416cd700 (LWP 903)]
. GDB info threads
печатает следующее: ![image](https://user-images.githubusercontent.com/16674092/78265931-651e6b00-7505-11ea-9f15-7b8c64505428.png)
Таким образом, номер нити. 2 заблокирован на select ()
функция системного вызова. Чего ждет эта тема?
участник создания выделяет 4 новых потока. Теперь GDB info threads
печатает следующее:
Какова цель этой темы? Из рисунка видно, что потоки 3 и 5 ожидают переменную условия, а потоки 4 и 6 заблокированы на select ()
. Чего они ждут? Я предполагаю, что один из этих новых потоков (темы № 3-6) - это тот, кто отвечает за периодическую отправку сообщений, чтобы объявить о присутствии участника в сети. Если это так, то должен также присутствовать его «корреспондент-слушатель», то есть поток, отвечающий за обнаружение такого рода сообщений по сети. Не так ли? Однако то, что я только что сказал, объясняет только два из четырех потоков. Как насчет двух оставшихся? В спецификациях DDS и RTPS говорится, что должны быть предусмотрены 4 встроенные темы, и для каждой из них имеются соответствующие устройства чтения и записи данных. устройство чтения / записи данных связано с подписчиком / издателем (в соответствии с требованиями спецификации DDS). Таким образом, два оставшихся потока могут быть этими подписчиком и издателем.
Создание data_writer приложения выделяет 2 новых потока. Теперь GDB info threads
печатает следующее:
Для чего нужны эти темы?
Что происходит под капотом? Заранее спасибо.
Вы можете увидеть выпуск github здесь