我有一个由一个线程填充的byte []列表,然后我有另一个线程从该列表中读取并通过网络发送这些项目。
我想每次读取thread2中的项目以从内存中清除它。但是因为我正在使用线程,如果我使用.remove,我将不得不处理更改列表的索引,并且在我这样做时不让thread1写入它。所以,所以我不与列表的索引进行交互,我只是将我使用的项目更改为 null 。这样做的最佳方法是什么,以免浪费内存空间?
答案 0 :(得分:4)
听起来你想要使用ConcurrentQueue
。
ConcurrentQueue
是一个线程安全的先进/先出集合,因此第一个线程会将项目推送到队列Enqueue
,而第二个线程会尝试从中读取项目排队TryDequeue
。
答案 1 :(得分:2)
基于问题,它听起来像是关键部分的分配(又名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
。