堆栈空异常
回答
您必须同步接入使用的东西时,像Stack<T>
。最简单的方法是使用lock
,然后让您使用lock
进行同步;所以流行将是:
int item;
lock (SharedMemory)
{
while (SharedMemory.Count == 0)
{
Monitor.Wait(SharedMemory);
}
item = SharedMemory.Pop();
}
Console.WriteLine(item);
,并推动将是:
lock (SharedMemory)
{
SharedMemory.Push(item);
Monitor.PulseAll(SharedMemory);
}
不会使用MBen建议的'ConcurrentStack
@codesparkle如果它有阻塞的'Pop'方法,也许;但事实并非如此。它只有“如果有东西在那里,请给我一些东西”,又名'TryPop' –
这对我感谢兄弟:); –
how is that possible the stack is full & has 16 items??!
在多线程环境中,它是非常有可能的。
您的程序中是否使用了多个线程?如果是,SharedMemory
应在lock
之前进行任何更改。
...并在查询之前! –
如果SharedMemory
是Stack
,并且因为您正在使用多线程并且您正在使用.Net 4。你应该使用:ConcurrentStack
编辑
我的第一个编辑和Quartermeister这是一个简单有效的解决方案有很大意见后:
int item;
var SharedMemory = new BlockingCollection<int>(new ConcurrentStack<int>());
// later in the Consume part
item = SharedMemory.Take(); // this will block until there is an item in the list
Console.WriteLine(item);
- 1. 堆栈空间异常
- 2. 空引用异常堆栈
- 3. 无底堆栈的空指针异常
- 4. 异常的空堆栈跟踪
- 5. 异常和堆栈跟踪
- 6. 堆栈溢出异常
- 7. 导致堆栈异常(x86)
- 8. 堆栈溢出异常
- 9. 堆栈展开异常C++
- 10. 异常堆栈跟踪
- 11. 堆栈溢出异常
- 12. Sammy.js异常堆栈跟踪
- 13. VxWorks堆栈帧异常大
- 14. 堆空间异常
- 15. 的Java空指针异常 - 堆栈跟踪空
- 16. 调用堆栈上的异常处理堆栈帧的顺序
- 17. checkAndLoadTargetData.Java堆空间异常
- 18. Java堆空间异常
- 19. 没有堆栈跟踪异常
- 20. 异常向上传播调用堆栈
- 21. Java异常处理和堆栈跟踪
- 22. Resque:异常和堆栈跟踪
- 23. ASM ByteCode - 异常的堆栈跟踪
- 24. 如何缩小堆栈溢出异常?
- 25. 弹出时的Android异常堆栈中
- 26. 检索异常全堆栈跟踪
- 27. IIS中的堆栈溢出异常
- 28. 如何从异常“跳”到堆栈帧?
- 29. Control.EndInvoke重置调用堆栈异常
- 30. 初学者堆栈,OutofBoundsException异常Java
您已经标记了这个多线程所以我猜许多线程访问该代码。我也猜测'SharedMemory'不是线程安全的,而且你没有锁定它。我对吗? – Rotem
在这种情况下'SharedMemory'是什么?什么是'全'? –
您的问题标题显示“Stack empty”,您的第一句话显示“Stack full”。这里是什么? –