如何将GSocketService附加到非默认的主循环上下文?

时间:2013-11-11 10:02:36

标签: glib gio

有没有办法将GSocketService附加到非默认(NULL)主循环上下文? A正在搜索API,无法为GSocketService找到任何“附加”功能。也许GSocketService中包含一些较低级别结构的函数,但我不确定在非默认主循环上下文中运行时发出“传入”信号会是怎样的。

1 个答案:

答案 0 :(得分:0)

来自GSocketService Docbook条目:

  

套接字服务在线程默认上下文的主循环上运行   它创建的线程,并且通常不是线程安全的。   但是,启动和停止服务的调用是线程安全的   这些可以从处理传入客户端的线程中使用。

要更改线程默认上下文,请使用g_main_context_push_thread_default/pop_thread_default

g_main_context_push_thread_default ()
  

void g_main_context_push_thread_default(GMainContext   *上下文);获取上下文并将其设置为当前线程的线程默认上下文。这将导致某些异步   在此开始的操作(例如大多数基于gio的I / O)   线程在上下文中运行并将结果传递给它的主要部分   循环,而不是在主要的全局默认上下文中运行   线。请注意,调用此函数会更改返回的上下文   通过g_main_context_get_thread_default(),而不是返回的那个   g_main_context_default(),因此它不会影响使用的上下文   像g_idle_add()。

这样的函数      

通常在创建新函数后不久会调用此函数   线程,传递一个GMainContext,它将由GMainLoop运行   该线程,为所有异步操作设置新的默认上下文   那个帖子。 (在这种情况下,你不需要打电话   g_main_context_pop_thread_default()。)但在某些情况下,您可以   想要在非默认上下文中安排单个操作,或者   暂时在主线程中使用非默认上下文。在那里面   case,你可以将调用包装在一个异步操作中   g_main_context_push_thread_default()/   g_main_context_pop_thread_default()对,但这取决于你   确保没有其他异步操作意外启动   非默认上下文处于活动状态。

     

请注意,此功能之前的库可能不正确   处理从具有线程默认上下文的线程使用。例如,见   g_file_supports_thread_contexts()。

     

上下文:

     

GMainContext,或全局默认上下文的NULL。 [允许-无]   自2.22以来