堆棧空異常
回答
您必須同步接入使用的東西時,像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」。這裏是什麼? –