我有一个要添加元素的GLib.List。
我想使用多个GLib.Threads同时添加这些元素
我正在尝试使用GLib.Mutex同步对列表的访问。同步似乎有效,但未添加任何元素。
public static void main() {
var list = new GLib.List<string>();
var mutex = GLib.Mutex();
var workerA = new Worker("A", list, mutex);
var workerB = new Worker("B", list, mutex);
var workerC = new Worker("C", list, mutex);
GLib.Thread<void*> tA = new GLib.Thread<void*>("WorkerThread", workerA.run);
GLib.Thread<void*> tB = new GLib.Thread<void*>("WorkerThread", workerB.run);
GLib.Thread<void*> tC = new GLib.Thread<void*>("WorkerThread", workerC.run);
tA.join();
tB.join();
tC.join();
stdout.printf("List:\n");
foreach (string str in list) {
stdout.printf(" - %s\n", str);
}
}
class Worker : GLib.Object {
private string name;
private weak GLib.List<string> list;
private weak GLib.Mutex mutex;
public Worker(string name, GLib.List<string> list, GLib.Mutex mutex) {
this.name = name;
this.list = list;
this.mutex = mutex;
}
public void* run() {
mutex.lock();
list.append(name);
mutex.unlock();
return null;
}
}
当我查看同步部分时,它似乎工作正常(即使使用更多线程),但没有任何元素添加到列表中!
输出:
列表:
有人可以告诉我该怎么做吗?
多亏apmasell指出了无效的东西实际上是GLib.List
我看了C源代码。
他是对的:该append
方法修改了指针-但如果GLib.List
为空,则仅修改(!)!
因此,除了使列表成为全局变量或使用其他列表实现之外,我认为最好的解决方法是在将列表传递给线程之前简单地添加一个元素。
完成所有线程后,您可以简单地再次删除该元素。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句