我找到的典型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);
显然这不会编译。使用此回调签名创建线程的正确方法是什么?
答案 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。