0

我目前正在开展一个项目,该项目需要我对要处理的网络数据包进行排队。我有一个最多有 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;
}

“数据包”是以下类的 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。

4

1 回答 1

1

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

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

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

于 2012-06-06T17:21:43.523 回答