C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: C♯におけるキューについて


(過去ログ 130 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■76822 / inTopicNo.1)  C♯におけるキューについて
  
□投稿者/ やかん (1回)-(2015/08/21(Fri) 01:10:35)

分類:[C#] 


はじめまして、やかんといいます。

キューついて、質問させてください。

状況は、「あるキューに対して、Enqueueが出来るが、Countが0」ということはありますか?

原因を考えた結果、各種宣言の仕方が原因なのかな?と思いました。

・クラスの宣言は以下の通りです。
Cというクラスがあります
public class C

B(親)クラスから、Cクラスは以下のように宣言され、インスタンスが作られます。
private static C c;
※最初のメソッドで
c = new C();
と設定してます。
最初に呼び出されたときに、外部からデータを受信してキューにため込むスレッド、外部へ送信するスレッドを生成します。

さらにBクラスは、Aクラスで以下のように宣言されます。
private B b = new B();

・キューについて
Cクラスの中に、
private Queue<xxxx> RecvQue { get; set; } /*!< 受信キュー */
というキューがあります。

このキューは、Cクラスの中にCountというメソッドを作成し、それをBクラスから呼び出し、更にAクラスから呼び出せるようにしています。
Enqueueをするのは、Cクラスで生成されたスレッド内で行われます。
Dequeueをするのは、Cクラス内のメソッドです。(CountのようにAクラスから呼び出せます。)

また、キューはCount、Dequeue、Enqueue、Clearを行う際はにlock(_lockobj){}で囲むようにしています。
(_lockobjは、クラスCの頭に、private object _lockobj = new object();と宣言しています)
 →_lockobjはnetstreamのRead・Write時にも使用しています)

・現象について
相手装置のROMを変更し、再接続を行った結果、何故か、Enqueueは出来るが、Countを行うと0が返され、Dequeue出来なくなってしまいました。
(Countは、Aクラスが500msの周期で呼び出しています)
もともとは、Enqueue、Count、Dequeueはバッチリ出来ていました。

相手装置と再接続したら、キューのオブジェクトが変わったりして、countが0でDequeueが出来なくなったのでしょうか?

どなたか、何かもし知っている事があれば、ご教示いただけないでしょうか?
おねがいいたします><。
引用返信 編集キー/
■76823 / inTopicNo.2)  Re[1]: C♯におけるキューについて
□投稿者/ なちゃ (65回)-(2015/08/21(Fri) 01:51:31)
No76822 (やかん さん) に返信

ソースが分からんので何とも言えないのですが、一般論としては、マルチスレッドでEnqueueとDequeueを行うなら、実装によってはタイミング問題でそういうことは起こります。
ただ、実際のソースを見ないと本当にそういう問題が発生しうるかは分かりません。
あくまでDequeueが単一スレッドでCount確認してから1回Dequeueするだけという構造なら起こらないでしょうし。

感覚的に言えば、何かスレッドの制御とキューの制御辺りで、何かしら問題が発生する余地のある実装になっている可能性が高いだろう、とは思います。
引用返信 編集キー/
■76824 / inTopicNo.3)  Re[2]: C♯におけるキューについて
□投稿者/ 774RR (296回)-(2015/08/21(Fri) 09:54:55)
ソースコードがないからなんともいえないあたりは同意見っす。
マルチスレッドで queue 使うなら、難しく考えずに ConcurrentQueue<T>
https://msdn.microsoft.com/ja-jp/library/Dd267265.aspx

引用返信 編集キー/
■76825 / inTopicNo.4)  Re[1]: C♯におけるキューについて
□投稿者/ ぶなっぷ (41回)-(2015/08/21(Fri) 10:12:59)
ごめん。
長い説明ありがとうだけど、さっぱり理解できない(;^_^A アセアセ

要は、キューに追加(Enqueue)したはずのデータが、消失(Countが0でありDequeueも
できない)という話かな?

であれば、Queueクラスの不具合は考えにくいですから、
やはりスレッドの排他処理がうまくいってない線が濃厚ではないかと。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -