私は現在、処理するネットワークパケットをキューに入れる必要があるプロジェクトに取り組んでいます。利用可能なときにこれらのパケットを処理する最大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。