多线程调用DBUS服务注意事项

多线调用DBUS服务注意事项

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>

1.多线程初始化,特别不要忘记调用dbus_g_thread_init。

  1. g_type_init();
  2. g_thread_init(NULL);
  3. dbus_g_thread_init();

2.确保不同线程使用不同的DBusConnection。DBUS提供了函数dbus_bus_get_private用于获取独立的DBusConnection,但dbus-glib并没有提供相应的函数,我们自己可以封装一个。

  1. staticinline
  2. DBusGConnection*dbus_g_bus_get_private(DBusBusTypetype,
  3. GMainContext*main_context,
  4. GError**error)
  5. {
  6. DBusConnection*connection=NULL;
  7. DBusErrorderror={0};
  8. g_return_val_if_fail(error==NULL||*error==NULL,NULL);
  9. //XXX:makesurethisfunctioniscalledinmainthreadbycallingdbus_g_bus_get
  10. //_dbus_g_value_types_init();
  11. dbus_error_init(&derror);
  12. connection=dbus_bus_get_private(type,&derror);
  13. if(connection==NULL)
  14. {
  15. dbus_set_g_error(error,&derror);
  16. dbus_error_free(&derror);
  17. returnNULL;
  18. }
  19. /*doesnothingifit'salreadybeendone*/
  20. dbus_connection_setup_with_g_main(connection,main_context);
  21. returnDBUS_G_CONNECTION_FROM_CONNECTION(connection);
  22. }


3.确保不同线程调用相同服务时不会使用同一个DBusProxy。如果使用了单实例,用下列方式让每个线程有独立的实例。
  1. EventManager*event_manager_get_default(void)
  2. {
  3. static__threadEventManager*event_manager=NULL;
  4. if(event_manager==NULL)
  5. {
  6. event_manager=event_manager_create();
  7. }
  8. returnevent_manager;
  9. }

__thread是C99中新增的,用于线程局部存储的编译指令,这里它让每个线程访问不同的实例。

4.如果在非主线程调用异步函数或者接收事件,一定要有自己的GMainLoop和GMainContext,并用下列函数与DBusConnection关联。

  1. dbus_connection_setup_with_g_main(connection,main_context);

~~the end~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值