运行多个并发GMainLoops

 手机用户2502871993 发布于 2023-01-30 09:53

是否允许GLib用户GMainLoop在多个线程中并发运行多个实例,每个线程都运行自己的实例?我发现整个地方都有"是"和"否"的答案.我意识到这个问题之前已经在这个论坛(2011年12月)中被提出过.

但是,我能够GMainLoop在没有明显问题的情况下同时运行两个实例.我的测试代码非常简单:

    创建GMainLoopmain()

    使用默认上下文和主循环创建超时源 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,并且能够以并发方式独立运行这些循环.

1 个回答
  • "GTK +发展基础"一书指出:

    GLib主循环实现为许多结构,允许多个实例同时运行.

    因此,鉴于此,我的测试代码以及我在上面评论中发布的链接,我们对此问题有了明确的答案.

    即:多个线程可以拥有自己的GMainContext和GMainLoop,并且能够以并发方式独立运行这些循环.

    2023-01-30 09:56 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有