glib основной цикл pthread слишком занят? - PullRequest
0 голосов
/ 31 мая 2019

Многопоточное программное обеспечение C-сервера, работающее таким образом:

1 поток является API отдыха (связан с libmicrohttpd)
1 поток устанавливает соединение STUN (используя libnice)
1 поток отвечает за ssl handhsake (openssl)
1 поток собирает данные (в кольцевом буфере)
1 поток распределяет эти данные (из кольцевого буфера)

клиент (javascript) работает в браузере (Firefox, Chrome или Safari) в Linux, Windows, MacOS или iO.

Safari в iOS не выдает локальных кандидатов на льды, поэтому я активировал расширенную опцию кандидатов на mDNS, и она прекрасно работает.

проблема в том, что как только мне перезвонят в cb_component_state_changed с состоянием "соединения", я начинаю получать данные в cb_nice_received, даже если соединение не установлено (в потоке соединения stun).

Я начинаю неоднократно получать приветствие от клиента, и остальная нить API почему-то становится неактивной, потому что основной запрос работает интенсивно, и я не вижу кандидата на лед, который отправляется браузером и поэтому не может кормить агента этим, следовательно Соединение с оглушением не завершено. Я вижу это в wireshark, но обратный вызов libmicrohttpd не вызывается, поэтому я никогда не завершаю ледовое соединение

В основном мой вопрос состоит из двух частей:

Почему я получаю данные в cb_nice_received, хотя на этом этапе соединение не установлено?

Как мне поступить, может быть, замедлить основной глобал, чтобы остальная нить API могла вставить слово на ребро ...

программное обеспечение работает безупречно в Firefox и Chrome в Linux, Windows и Mac OS, в Safari в Mac OS, но проблемы обнаруживаются в Safari iOS.

Спасибо за вашу помощь; -)

Я уже пытался вставить ус в cb_nice_received, чтобы он уступил другим потокам, включая REST API, безрезультатно

ожидаемый результат - баланс между потоками, поэтому gloop не захватывает всю программу, не позволяя другим потокам работать

...