我如何从Vala中的不同线程添加到GLib.List

安斯加尔

我有一个要添加元素的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python sprite list如何工作?我可以将精灵坐标添加到列表中吗?

Java:线程:将带有 ID 的元素添加到不同线程的列表中

如何将数据添加到 MutableLiveData 中的 List?

当任务添加到不同线程中的空循环时,行为异常

如何从 firebase 中的不同集合获取文档并将它们添加到单个 List 以作为 Stream 返回?

Java8 - 如何将 List<List<String>> 添加到 List<List<String>>

我可以使用Kotlin将List中的MVoice字段添加到mutableSetOf()吗?

java中如何将地图对象添加到List中

如何使用list.insert将Python中的元素添加到列表的末尾?

Unity:如何不使用 GetComponent() 将引用添加到 List 中?

如何将字符串添加到列表<String>?List<String> 是模型中的模型

如何将Edge添加到列表<list <int >>的图形中?

如何将嵌套集合中的元素添加到List <string>?

如何迭代 List<Map<String,String>> 并将其键、值添加到 Java 对象中

如何将排序添加到 mat-list 中?

如何将已知类型添加到 List<T>?

如何将项目添加到List <T>的开头?

如何将List行为添加到ReferenceManyField?

如何将float变量添加到List <Point>?

将List <File>添加到Android中的捆绑包

List <T> .Add不添加到列表中

将缺失的键添加到 `list` 中的 `dict`

在 Dart 中将 Map 元素添加到 List 中

如何防止动态添加的父类添加到Angular Material,mat-selection-list中的子元素中?

从多个线程添加到 List<String> 时的预期行为是什么?

使用JQuery添加到List <Model>

将 SELECT 的内容添加到 LIST

将来自不同线程的值添加到全局集中,并等待所有线程完成

为什么我将新项目添加到List <string>并将其添加到列表的底部?