如何传递GLib.Thread参数

时间:2018-01-08 19:14:43

标签: vala

我找到的典型GLib.Thread示例是:

new Thread<void*>(null,() => { return null; };

当没有将参数传递给线程时,这很有效。

GLib.Thread文档显示了一个使用类实例提供线程数据的示例。

// Start a thread:
MyThread my_thread = new MyThread (10);
Thread<int> thread = new Thread<int>.try ("My fst. thread", my_thread.run);

这是将参数传递给线程的唯一方法吗?文档还说:

  

新线程首先使用参数data调用func。数据:
  提供给新主题的论据。

指定参数数据在哪里以及如何在线程中访问它?

例如,想象一下这个回调签名:

private string cbThreadSample(int id,string msg, Socket client_socket){
   //...do stuff
   return "good job";
   }

我对使用的想法是这样的:

new GLib.Thread<string>("my thread sample",this.cbThreadSample,id,msg, client_socket);

显然这不会编译。使用此回调签名创建线程的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

data参数是您传递给线程的委托的一部分。

如果你这样做:

new GLib.Thread<string>("my thread sample",
  () => this.cbThreadSample(id,msg, client_socket));

在底层C代码中,这将被翻译成如下:

struct lambda0__data {
  WhateverClass *self;
  int id;
  gchar *msg;
  GSocket client_socket;
};

void *lambda0__func(lambda0__data *context) {
   whatever_class_cbThreadSample(context->self,
     context->id, context->msg,
     context->client_socket));
    return NULL;
}

...
lambda0__data *thread_data = g_new0(lambda0__data);
thread_data->self = self;
thread_data->id = id;
thread_data->msg = gstrdup(msg);
thread_data->client_socket = g_object_ref(socket);
g_thread_try_new("my thread sample", lambda0__func, thread_data);

传递的数据参数与委托(lambda或方法引用)相关联。在使用子类MyThread的情况下,MyThread的实例将作为数据参数传递。

这不是直接可访问的。它隐式传递为lambda的捕获或实例的this

另外,如果您实际上将此用于请求处理程序,则可能需要使用ThreadPool