0%

正确理解glib main loop

我想应该很多人都不太了解glib库,只有那些长时间在Linux系统上搞开发的同学才知道这个库。但即便知道有这么一个库,使用它的人也少之又少。

glib库是Linux系统下极重要的一个C语言开发的开源库,Linux系统下很多开具都是以它为基础的,比如说GTKgstreamer以及我向大家介绍的janus程序。

glib库涉及的内容很多,今天我主要给大家介绍一下glib中的main loop机制。实际glibmain loop在它的官方文档中有清晰的说明,地址在这里大家可以自己阅读一下。

什么是Main Loop

实际上,GLibMain Loop就是对 selectpoolepoll的封装。它可以处理不同类型的,像文件描述符(普通文件、管道、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

如何创建一个新的事件