是否允许GLib用户GMainLoop
在多个线程中并发运行多个实例,每个线程都运行自己的实例?我发现整个地方都有"是"和"否"的答案.我意识到这个问题之前已经在这个论坛(2011年12月)中被提出过.
但是,我能够GMainLoop
在没有明显问题的情况下同时运行两个实例.我的测试代码非常简单:
创建GMainLoop
于main()
使用默认上下文和主循环创建超时源 g_timeout_add
在main()中创建一个GThread
使用运行主循环 g_main_loop_run
[THREAD CONTEXT]:使用创建上下文 g_main_context_new
[THREAD CONTEXT]:将该上下文设置为线程默认使用 g_main_context_push_thread_default
[THREAD CONTEXT]:使用创建循环g_main_loop_new
并为其提供新的上下文
[THREAD CONTEXT]:创建一个超时源,并通过它将其附加到新的上下文 g_source_attach
.
[THREAD_CONTEXT]:让线程调用 g_main_loop_run
这样做,我看到两个GMainLoop
工作的实例都很好.正确调用超时回调,稍后对g_main_loop_quit的调用按预期工作.
因此,让多个GMainLoop
实例同时工作似乎不是问题.但也许我还没有充分运用API来完全掌握这种情况.这个问题有明确的答案吗?
另外,如果有人关心的话,这是实际的测试代码:
#define THREAD_TIMEOUTS (20) #define MAIN_TIMEOUS (1) typedef struct timeout_struct { int i; int max; GMainLoop *loop; char *name; } TIMEOUT_STRUCT; gboolean timeout_callback(gpointer data) { TIMEOUT_STRUCT *psTimeout = (TIMEOUT_STRUCT *)data; psTimeout->i++; if (psTimeout->i == psTimeout->max) { if (psTimeout->max == THREAD_TIMEOUTS) { g_main_loop_quit( (GMainLoop*)psTimeout->loop ); } return FALSE; } return TRUE; } void* thread_function(void *data) { GMainContext *ps_context; GMainLoop *ps_loop; GSource *ps_timer; TIMEOUT_STRUCT sTimeout; ps_context = g_main_context_new(); g_main_context_push_thread_default(ps_context); ps_loop = g_main_loop_new(ps_context, FALSE); sTimeout.i = 0; sTimeout.max = THREAD_TIMEOUTS; sTimeout.loop = ps_loop; sTimeout.name = "thread"; ps_timer = g_timeout_source_new_seconds(1); g_source_set_callback(ps_timer, timeout_callback, &sTimeout, NULL); g_source_attach(ps_timer, ps_context); g_main_loop_run(ps_loop); g_main_loop_quit( (GMainLoop*)data ); return NULL; } /* * This main boots a thread, then starts up a GMainLoop. Then the thread runs * a GMainLoop. The thread sets a timer that fires ten times and the main sets a * timer that fires two times. The thread quits and * and then the other main l * * * */ int main() { GThread *ps_thread; GMainLoop *loop; TIMEOUT_STRUCT sTimeout; loop = g_main_loop_new ( NULL , FALSE ); sTimeout.i = 0; sTimeout.max = MAIN_TIMEOUS; sTimeout.loop = loop; sTimeout.name = "main"; // add source to default context g_timeout_add (1 , timeout_callback, &sTimeout); ps_thread = g_thread_new("thread", thread_function, loop); g_main_loop_run (loop); g_main_loop_unref(loop); }
pkurby.. 13
"GTK +发展基础"一书指出:
GLib主循环实现为许多结构,允许多个实例同时运行.
因此,鉴于此,我的测试代码以及我在上面评论中发布的链接,我们对此问题有了明确的答案.
即:多个线程可以拥有自己的GMainContext和GMainLoop,并且能够以并发方式独立运行这些循环.
"GTK +发展基础"一书指出:
GLib主循环实现为许多结构,允许多个实例同时运行.
因此,鉴于此,我的测试代码以及我在上面评论中发布的链接,我们对此问题有了明确的答案.
即:多个线程可以拥有自己的GMainContext和GMainLoop,并且能够以并发方式独立运行这些循环.