2012-06-05 46 views
0

我目前正在開發一個項目,要求我排列要處理的網絡數據包。我有一個最多有25個線程的ThreadPool,它們在可用時處理這些數據包。但是,將分組數據(封裝在類中)傳遞給與ThreadPool關聯的thread_proc方法時,數據被破壞。我聲明我的線程池變量像這樣:使用ThreadPool的Vala中的數據損壞

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; 
    } 
} 

上面的類是什麼包含實際的數據包數據(「數據」var)。當數據包實例到達thread_proc時,變量值全都是錯誤的...

任何幫助,爲什麼會發生這種情況和一個可能的解決方案將不勝感激。先謝謝你。

〜邁克爾K.

+1

你看過生成的C以確保Vala正在進行適當的內存管理嗎?您也可以嘗試在valgrind下運行該程序,以確保它不使用已釋放的回憶。 – apmasell

回答

1

我只是把a commit到華劣克混帳,這將讓瓦拉自動管理數據。它會破壞向後兼容性,所以你將不得不使用新的構造函數(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)要擁有正確的簽名更好。

+0

非常感謝!手動增加參考計數器對我來說是這樣:)我也按照你的建議做了,並且將演員刪除到Func ,因爲它是不必要的。當我看到ThreadPool示例時,它一定是我的疏忽。 –