DBUS——多线程处理

DBUS - multithread processing

本文关键字:多线程处理 DBUS      更新时间:2023-10-16

我的程序中有一个主循环,它调用dbus_connection_read_write_dispatch方法。我有一些注册回调,当消息到达时调用。在这个回调中,我还处理响应并发回响应。问题是,有时它需要很多时间,所以它可能会阻止从DBUS接收消息。我可以从多个线程调用同一连接上的dbus_connection_read_write_dispatch()吗?在处理前一个DBUS消息的同时,是否有可能接收新的DBUS消息?或者在另一个线程中处理响应比在调用回调的主循环中处理响应更好吗?

你可以调用dbus_connection_read_write_dispatch()从多个线程,如果你已经调用函数dbus_threads_init_default()至少一次。相反,一个更好的方法是让一个线程运行dbus调度程序,并使用一个线程池来处理来自回调的数据。查看dbus_threads_init_default()获取更多信息

通过freedesktop.org提供的文档,您可以。

但是如果您直接从不同的线程操作相同的DBusConnection实例,例如:在一个线程中调用dbus_connection_send_with_reply_and_block,而另一个线程阻塞dbus_connection_read_write_dispatch,连接可能工作不正常。根据官方文件,当调用回调函数时,DBus连接将被锁定。DBusConnection

在我的情况下,即使返回消息被发送到我的进程(我在dbus-monitor上看到了它),dbus_connection_send_with_reply_and_block也没有返回。调用dbus_thread_init根本不起作用

最近我使用委托在一个线程中发送/接收/调度所有dbus消息,问题消失了

freedesktop.org邮件列表中的邮件