キュー操作で意図しない動作をすることがあり、調査のため、テストプログラムを
作成して実行したところ、以下のような事象が発生しました。
どのような条件で発生したか想像もつきません。
何かしらのヒントでもいただければと思い、ご質問させていただきました。
プログラムについて
- キューへ登録するスレッド、キューから取り出すスレッドを準備。
- それぞれwhileでループし、ループ処理のはじめにSleep()で10ms待つ。
- キュー操作は、排他制御していない。
- キューへ登録した直後、キューから取り出し、取り出したデータが有効な時、
キューからデータを取り出せない(カウントが0、又はDequeue()の戻りがnull)
時、それぞれで計数する。
上記のテストプログラムを実行し、1時間ほど経過したとき、以下の状況が5分
程度継続しました。
※登録カウント - 取出カウント = 取り出せない(と判断した)回数
以下、ソースコード
・キューへ登録する処理 private void SetQueue(int code, object data) { Container queData = new Container(); queData.code = 1; queData.data = data; _DataQue.Enqueue(queData); _entryCount++; } ・キューから取り出す処理 private void GetQueue(out int code, out object data) { code = 0; data = null; Monitor.Enter(_DataQue); try { if (_DataQue.Count > 0) { Container queData = _DataQue.Dequeue(); if (queData != null) { code = queData.code; data = queData.data; _ejectCount++; } else { _notCount++; } } else { _notCount++; } } finally { Monitor.Exit(_DataQue); } }
こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています
わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
https://teratail.com/questions/22377 ← の類似スレッドだと思いますが、まずクローズしたほうが良いのでは。
質問者さんに対して応答せずに新たな質問を複数投稿するのは如何なものかと思います。(他にもあなたが作成した同様のスレッドが多々あります。)
ご指摘どおり、関連しております。関連項目は、コメントにつづけてします。別の質問として、投稿したほうがよいかと思い別の質問にしました。本件クローズします。
回答2件
あなたの回答
tips
プレビュー