我有一個由一個線程填充的字節[]的列表,然後我有另一個線程正在讀取該列表並通過網絡發送項目。 如何從列表中刪除項目而不刪除.remove?
我希望每次讀取thread2中的一個項目以從內存中清除它。但是,因爲我使用線程,如果我使用.remove我將不得不處理更改列表的索引,並且不讓thread1寫入它,而我這樣做。所以,所以我不與列表的索引交火,我只是改變我使用的項目null。這樣做的最佳方式是什麼,以避免浪費內存空間?
我有一個由一個線程填充的字節[]的列表,然後我有另一個線程正在讀取該列表並通過網絡發送項目。 如何從列表中刪除項目而不刪除.remove?
我希望每次讀取thread2中的一個項目以從內存中清除它。但是,因爲我使用線程,如果我使用.remove我將不得不處理更改列表的索引,並且不讓thread1寫入它,而我這樣做。所以,所以我不與列表的索引交火,我只是改變我使用的項目null。這樣做的最佳方式是什麼,以避免浪費內存空間?
這聽起來像是你想用ConcurrentQueue
來代替。
A ConcurrentQueue
是線程安全的先入先出集合,所以第一個線程將Enqueue
推送到隊列中,而第二個線程將嘗試使用TryDequeue
讀取該隊列中的項目。
根據問題,這聽起來像是關鍵部分的分配(又名lock
)。
創建鎖定對象,並執行讀lock
下/寫:
object lockList = new object();
byte ReadFromList(int index)
{
lock(lockList) { return theList[index]; }
}
void RemoveFromList(int index)
{
lock(lockList) { theList.Remove(index); }
}
注意,通常是生產者/消費者你會使用ConcurrentQueue
。
爲什麼不使用['ConcurrentQueue'](https://msdn.microsoft.com/en-US/library/dd267265(v = vs.110).aspx)? – sloth