有没有办法将 GSocketService 附加到非默认(NULL)主循环上下文?A 正在搜索 API,但无法找到 GSocketService 的任何“附加”函数。也许 GSocketService 中包含的某些较低级别的结构有这样的功能,但我不确定在非默认主循环上下文中运行时发出“传入”信号会如何。
1 回答
从GSocketService
Docbook 条目:
套接字服务在创建它的线程的线程默认上下文的主循环上运行,通常不是线程安全的。但是,启动和停止服务的调用是线程安全的,因此可以从处理传入客户端的线程中使用这些调用。
要更改线程默认上下文,请使用g_main_context_push_thread_default/pop_thread_default
:
g_main_context_push_thread_default ()
无效 g_main_context_push_thread_default (GMainContext *context); 获取上下文并将其设置为当前线程的线程默认上下文。这将导致在此线程中启动的某些异步操作(例如大多数基于 gio 的 I/O)在上下文下运行并将其结果传递到其主循环,而不是在主线程中的全局默认上下文下运行。请注意,调用此函数会更改 g_main_context_get_thread_default() 返回的上下文,而不是 g_main_context_default() 返回的上下文,因此它不会影响 g_idle_add() 等函数使用的上下文。
通常,您会在创建新线程后不久调用此函数,将 GMainContext 传递给它,该 GMainContext 将由该线程中的 GMainLoop 运行,为该线程中的所有异步操作设置新的默认上下文。(在这种情况下,您不需要调用 g_main_context_pop_thread_default()。)然而,在某些情况下,您可能希望在非默认上下文中安排单个操作,或者在主线程中临时使用非默认上下文. 在这种情况下,您可以将对异步操作的调用包装在 g_main_context_push_thread_default() / g_main_context_pop_thread_default() 对中,但您需要确保在非默认上下文处于活动状态时不会意外启动其他异步操作。
请注意,早于此函数的库可能无法正确处理从具有线程默认上下文的线程中使用的情况。例如,参见 g_file_supports_thread_contexts()。
语境 :
一个 GMainContext,或 NULL 用于全局默认上下文。[allow-none] 从 2.22 开始