【问题标题】:Data corruption in Vala with ThreadPoolVala 中的数据损坏与 ThreadPool
【发布时间】:2012-06-07 01:21:43
【问题描述】:

我目前正在开展一个项目,该项目需要我对要处理的网络数据包进行排队。我有一个最多有 25 个线程的 ThreadPool,当它们可用时处理这些数据包。但是,当将数据包数据(封装在一个类中)传递给与 ThreadPool 关联的 thread_proc 方法时,数据会被破坏。我像这样声明我的 ThreadPool 变量:

pool = new ThreadPool<Packet>((Func<Packet>)thread_proc, 25, false);

这是检查可用数据包的线程方法:

void* run()
{
    while (true)
    {
        var packet = packets.poll();

        try
        {
            pool.push(packet);
        }
        catch (ThreadError e)
        {
            error(e.message);
        }
    }

    return null;
}

“packets”是以下类的BlockingQueue(使用互斥锁的自定义阻塞队列):

class Packet : Object
{
    public unowned ClientHandler client;
    public uint8[] data;
    public int index;
    public int size;

    public Packet(ClientHandler client, uint8[] data, int index, int size)
    {
        this.client = client;
        this.data = data;
        this.index = index;
        this.size = size;
    }
}

上述类是包含实际数据包数据(“数据”变量)的内容。当 Packet 实例到达 thread_proc 时,变量值都错误了......

任何关于为什么会发生这种情况的帮助以及可能的解决方案将不胜感激。提前谢谢你。

~迈克尔·K。

【问题讨论】:

  • 您是否查看了生成的 C 以确保 Vala 进行了适当的内存管理?您也可以尝试在 valgrind 下运行程序,以确保它没有使用释放的内存。

标签: segmentation-fault bytearray threadpool vala


【解决方案1】:

我刚刚将a commit 推送到 valac git,这将让 Vala 自动管理数据。它会破坏向后兼容性,因此您必须使用新的构造函数 (ThreadPool.with_owned_data) 和方法(添加而不是推送)。

如果您想避免对 valac git 的依赖,您可以在推送之前执行 packet.ref (),然后在回调结束时执行 packet.unref () (thread_proc)。 https://bugzilla.gnome.org/attachment.cgi?id=214884 有一个例子。

请注意,在 ThreadPool 构造函数中转换 thread_proc 可能会破坏新的内存管理内容。坦率地说,你真的应该避免选派代表……这是惹麻烦的好方法。最好只修复您的函数(在这种情况下为thread_proc)以具有正确的签名。

【讨论】:

  • 非常感谢!手动增加引用计数器对我来说是这样的:) 我也按照你的建议做了,并删除了对 Func 的强制转换,因为它是不必要的。在我看到的 ThreadPool 示例中,这一定是我的疏忽。
猜你喜欢
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2016-12-22
  • 1970-01-01
  • 2015-01-30
相关资源
最近更新 更多