LINUX.ORG.RU

как прибить webrtc треды при этом сохранив главный процесс?

 , , , ,


0

1

Есть слинкованый статично бинарник.
В нём есть разные вещи, есть webrtc.

В какой-то момент вызывается вещи из вебрст, которые после работы мне нужно завершать.
Делать это из кода я не научился ибо не разработчик.


Возможно как-то можно килять отдельные треды у процесса?
Так, чтобы процесс при этом выжил и продолжил делать свои дела?


пробовал делать цепляться через gdb и делать
в gdb оно выглядит так

может у кого-то ещё есть идеи как прибить эти треды вебрст?)

thread apply 10 call (int) pthread_cancel(pthread_self())



 PID   SPID TTY          TIME CMD
345146 345146 pts/0    00:00:00 main
345146 345147 pts/0    00:00:00 main
345146 345148 pts/0    00:00:00 main
345146 345149 pts/0    00:00:00 main
345146 345178 pts/0    00:00:00 main
345146 345179 pts/0    00:00:00 main
345146 345180 pts/0    00:00:00 main
345146 345181 pts/0    00:00:00 main
345146 345182 pts/0    00:00:00 client
345146 345426 pts/0    00:00:00 WebRTC-Manager
345146 345427 pts/0    00:00:00 media
345146 345428 pts/0    00:00:00 work
345146 345429 pts/0    00:00:00 main
345146 345430 pts/0    00:00:00 rtc-low-prio
345146 345431 pts/0    00:00:00 TaskQueuePacedS
345146 345432 pts/0    00:00:00 rtp_send_contro
345146 345433 pts/0    00:00:00 ModuleProcessTh
345146 345434 pts/0    00:00:00 AudioEncoder
345146 345447 pts/0    00:00:00 DecodingQueue
345146 345448 pts/0    00:00:00 IncomingVideoSt



		
Id			
Id				
1	"main"			clock_nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
2	"main"			clock_nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
3	"main"			do_futex_wait.constprop () from /lib/x86_64-linux-gnu/libpthread.so.0
4	"main"			select () from /lib/x86_64-linux-gnu/libc.so.6
5	"main"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
6	"main"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
7	"main"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
8	"main"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
9	"client"			poll () from /lib/x86_64-linux-gnu/libc.so.6
10	"WebRTC-Manager"			pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
11	"media"			pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
12	"work"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
13	"rtc-low-prio"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
14	"TaskQueuePacedS"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
15	"rtp_send_contro"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
16	"ModuleProcessTh"			pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib/x86_64-linux-gnu/libpthread.so.0
17	"AudioEncoder"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
18	"DecodingQueue"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
19	"IncomingVideoSt"			epoll_wait () from /lib/x86_64-linux-gnu/libc.so.6
		

★★★★★

Нельзя. А если и можно, то всё равно нельзя. В винде можно, технически, но ничео хорошего из этого не выйдет.

Ищи как останавливается основной цикл событий той webrtc поделки на основе которой ты работаешь с webrtc.

faq2
()
Ответ на: комментарий от smilessss

Высвобождается память стека, но не объекты выделенные в куче. Они не привязаны к конкретному треду и могут быть использованы из любого даже если по факту используются из одного. В языках без сборщика мусора такое освобождается исключительно руками.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от ox55ff

попробую ещё в исходном процессе сделать что-то вроде

_thread = rtc::Thread::Current();
    _data->thread.setObjectName("my Thread");
    _data->thread.start(QThread::TimeCriticalPriority);


и завершать через
_data->thread.quit();
            _data->thread.wait();
            _data = nullptr;


мне кажется если завершать тред, из корого порождаются те все процессы - они тоже по идее должны завершаться.

smilessss ★★★★★
() автор топика
Ответ на: комментарий от smilessss

мне кажется если завершать тред, из корого порождаются те все процессы - они тоже по идее должны завершаться.

Если программист явно об этом не позаботился, то нет.

ox55ff ★★★★★
()
Ответ на: комментарий от smilessss

Из документации Qt:

QThread::quit() - This function does nothing if the thread does not have an event loop.

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

С QThread::terminate() ты добьешься желаемого, потоки сдохнут, но дальше ждет неопределенное поведение программы, скорее всего упадет.

Мне кажется, копать надо в потоках WebRTC, но там документация скудна.

blex ★★
()
Ответ на: комментарий от blex

я так пропустил ещё

_data->thread.quit();


мне кажется он таки относится к

rtc::Thread::Current();

не к QT

а к webrtc

я проводил эксперемент - комментил thread.quit - и треды вебртс оставились висеть

Если коммент убрать - то килялись. Сделать бы так ещё в моей поделке как там(

это эта красота

https://github.com/desktop-app/lib_webrtc/blob/master/webrtc/details/webrtc_o...

стопается оно и создаётся я так понял так

               // stop
		         _data->thread.quit();
			_data->thread.wait();
			_data = nullptr;

               //start
	_thread = rtc::Thread::Current();
	_data = std::make_unique<Data>();
	_data->timer.setCallback([=] { processData(); });
	_data->thread.setObjectName("Webrtc OpenAL Thread");
	_data->thread.start(QThread::TimeCriticalPriority);


smilessss ★★★★★
() автор топика
Последнее исправление: smilessss (всего исправлений: 2)