スタックが空の例外が発生します。スタックが空でない場合(16個のアイテムがある場合)、それはどのように可能ですか?
エラーのスナップショットを取得しました:
誰か説明してもらえますか?
スタックが空の例外が発生します。スタックが空でない場合(16個のアイテムがある場合)、それはどのように可能ですか?
エラーのスナップショットを取得しました:
誰か説明してもらえますか?
のようなものを使用する場合は、アクセスを同期する必要があります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);
}
スタックがいっぱいで16個のアイテムがあるのはどうしてですか??!
マルチスレッド環境では、それは非常に可能です。
プログラムで複数のスレッドを使用していますか?はいの場合は、変更を加える前に編集するSharedMemory
必要があります。lock
の場合、およびマルチスレッドを使用してSharedMemory
いるためStack
、および.Net4を使用している場合。使用する必要があります: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);