我想应该很多人都不太了解glib
库,只有那些长时间在Linux系统上搞开发的同学才知道这个库。但即便知道有这么一个库,使用它的人也少之又少。
glib
库是Linux
系统下极重要的一个C
语言开发的开源库,Linux系统下很多开具都是以它为基础的,比如说GTK
、gstreamer
以及我向大家介绍的janus
程序。
glib
库涉及的内容很多,今天我主要给大家介绍一下glib
中的main loop
机制。实际glib
的main loop
在它的官方文档中有清晰的说明,地址在这里大家可以自己阅读一下。
什么是Main Loop
实际上,GLib
的Main Loop
就是对 select
、pool
、epoll
的封装。它可以处理不同类型的源
,像文件描述符(普通文件、管道、socket)和超时。新的事件源类型可以通过g_source_attach
添加到Main Loop
上。
为了可以在不同的线程中处理不同的源
集,每个源
都与一个GMainContext
相关。一个GMainContext
只能运行在一个线程中,但源
是可以跨线程的。在GMainContext或内置GSource上运行的所有函数都是线程安全的。
每个源
都有没一个优先级,默认是G_PRIORITY_DEFAULT
,也就是0。小于0的值有更高的优先权。高优先级的源
总是优先于低优先级的源
得到处理。
idle函数也能添加到MainLoop
中,当没有任何更高优先级的事件需要处理时就会执行它。
GMainLoop
表示一个主循环。它由g_main_loop_new
函数创建。添加了初始化事件源后,就可以调用g_main_loop_run()
函数了。该函数会持续的检测每个事件源是否有新事件,然后处理这些新事件。当不需要处理事件时,可以调用g_main_loop_quit()
退出main loop
。