方法
GLibMainContextpush_thread_default
since: 2.22
声明 [src]
void
g_main_context_push_thread_default (
GMainContext* context
)
描述 [src]
获取 context
并将其设置为当前线程的线程默认上下文。这将导致在本线程中启动的某些异步操作(如大多数[gio][gio]基础的I/O操作)在 context
下运行,并将它们的结果传递到其主循环中,而不是在主线程的全局默认主上下文中运行。请注意,调用此函数会更改g_main_context_get_thread_default()
返回的上下文,而不是g_main_context_default()
返回的上下文,因此它不会影响g_idle_add()
等函数使用的上下文。
通常您会在创建新线程的短时间内调用此函数,并提供一个将在该线程中由GMainLoop
运行的GMainContext
,以便为该线程中的所有异步操作设置新的默认上下文。在这种情况下,您可能不需要调用g_main_context_pop_thread_default()
,假设您希望新创建的GMainContext
在整个线程生命周期中作为默认上下文。
如果您无法控制新线程的创建方式(例如,新线程不是新创建的,或者线程生命周期由GThreadPool
管理),建议将需要使用新GMainContext
的逻辑包装在一个g_main_context_push_thread_default()
/ g_main_context_pop_thread_default()
对中,否则重用的线程最终将永远不会显式释放它们持有的GMainContext
引用。
在某些情况下,您可能需要在非默认上下文中安排单个操作,或在主线程中临时使用非默认上下文。在这种情况下,您可以将异步操作的调用包装在g_main_context_push_thread_default()
/ g_main_context_pop_thread_default()
对中,但是确保在非默认上下文活动期间没有其他异步操作意外启动的责任在于您。
请注意,早于此功能的库可能无法正确处理从具有线程默认上下文的线程中使用的场景。例如,参见g_file_supports_thread_contexts()。
自版本2.22开始支持: