GStreamer的Bus系统主要用于向用户提供内部Elements的事件信息。使用GStreamer的Bus系统,只要调用gst_bus_add_watch,并且注册一个Callback即可。但问题在于调用这个接口的时机,及用于处理Bus事件的线程。Callback内部以glib的Source机制实现,Source要attach到一个GMainContext上,且需要有一个GMainloop来侦听这个Context。通常,调用gst_bus_add_watch的线程,在未做过任何处理的情况下,这个Source attach的GMainContext是NULL,也就是Default Main Context。而侦听Default Main Context的线程未必就是调用者线程,这样在做资源回收时,会出现多线程互斥问题。
需要回调函数在调用者线程中执行的方法如下:
1. 在创建调用者线程之后,创建该线程自己的GMainContext与GMainloop,然后调用g_main_context_push_thread_default,将该Context作为线程自己的默认Context,并使用GMainloop侦听;
2. 之后再在该线程中调用gst_bus_add_watch,则Callback会在调用者线程中执行,避免了多线程互斥的问题。
此方法同时避免了应用的主线程负担过重的问题。另外,所有基于gio的应用,也会由于使用了g_main_context_push_thread_default,使得各线程的负载分散化。
本文详细介绍了GStreamer Bus系统如何在多线程环境中提供内部Elements事件信息,强调了在创建独立GMainContext与GMainloop以避免资源回收时的多线程互斥问题的重要性。同时,通过使用g_main_context_push_thread_default方法,确保了回调函数在调用者线程中执行,有效分散了应用线程的负载。
497

被折叠的 条评论
为什么被折叠?



