如何合并来自不同项目的事件循环
Ho to merge event loops from different projects
我正在使用 Strophe C 库进行 XMPP 消息传递和 libwebsock 来创建 Websocket server.What 我想做的是将在 strophe 上收到的消息转发到 Websocket 客户端,反之亦然。但是我不知道该怎么做。
此外,strophe 和 libwebsock 都需要 运行 事件循环来处理事件。我怎样才能 运行 两个循环或将它们合并为一个循环,以便在同一程序中处理来自两个库的事件?
提前致谢。 :)
首先你需要创建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();
}
我正在使用 Strophe C 库进行 XMPP 消息传递和 libwebsock 来创建 Websocket server.What 我想做的是将在 strophe 上收到的消息转发到 Websocket 客户端,反之亦然。但是我不知道该怎么做。
此外,strophe 和 libwebsock 都需要 运行 事件循环来处理事件。我怎样才能 运行 两个循环或将它们合并为一个循环,以便在同一程序中处理来自两个库的事件?
提前致谢。 :)
首先你需要创建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();
}