【问题标题】:Ho to merge event loops from different projects如何合并来自不同项目的事件循环
【发布时间】:2016-04-14 12:48:42
【问题描述】:

我正在使用 Strophe C 库进行 XMPP 消息传递和 libwebsock 来创建 Websocket 服务器。我想要做的是将在 strophe 上收到的消息转发到 Websocket 客户端,反之亦然。但是我不知道该怎么做。

strophe 和 libwebsock 都需要运行事件循环来处理事件。如何运行两个循环或将它们合并为一个,以便在同一程序中处理来自两个库的事件?

提前致谢。 :)

【问题讨论】:

标签: c event-handling libstrophe


【解决方案1】:

首先,您需要创建 2 个线程。设thread1 为libstrophe 的事件循环,thread2 为libwebsock 的事件循环。大致思路可以用下面的伪代码来描述:

xmpp_message_callback() {
    libwebsock_send_text();
}

thread1() {
    xmpp_run();
}

libwebsock_message_callback() {
    xmpp_send();
}

thread2() {
    libwebsock_wait();
}

main() {
    init_libstrophe()
    init_libwebsock();
    create_thread1();
    create_thread2();
    join_thread1();
    join_thread2();
}

但是 (!) 因为 libstrophe 不是线程安全的,所以您不能直接从 thread2 调用 xmpp_send()。相反,我建议使用互斥锁保护队列。因此,上面的示例转换为:

list  queue;
mutex queue_lock;

xmpp_message_callback() {
    libwebsock_send_text();
}

thread1() {
    while {
        xmpp_run_once();
        mutex_lock(queue_lock);
        while (queue is not empty) {
            stanza = list_pop_front(queue);
            xmpp_send(stanza);
        }
        mutex_unlock(queue_lock);
    }
}

libwebsock_message_callback() {
    mutex_lock(queue_lock);
    list_push(queue, stanza);
    mutex_unlock(queue_lock);
}

thread2() {
    libwebsock_wait();
}

【讨论】:

  • 谢谢。 :) 将尝试您的解决方案并尽快回复您!
  • 明确一点,我们这里使用互斥锁来实现与测试和设置方法的互斥。我说的对吗?
  • 对不起,我还不能“投票”,因为我的声誉仍然很低,但我接受了答案:) 感谢您的帮助!
  • 你对互斥锁是正确的。它保护queue 免受并发访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多