質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Q&A

解決済

1回答

2689閲覧

4096バイトのメンバ変数を複数スレッドから読み書きする状況を改善するため、ローカル変数するのは妥当なのでしょうか?

fuoh

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

0グッド

1クリップ

投稿2016/04/22 05:28

相手からの接続を待ち、接続が来たら受信処理をスレッドとして起動し、通信を行うサーバー型のプログラムを作成しております。
このプログラムを実行していると次のような事象がありました。

  1. 2つの接続があり、受信処理がそれぞれ起動、通信を行っている。
  2. ある時、受信したデータ長と電文中のデータ長が異なる電文を受信した。
  3. 受信したデータを処理中にプログラムが異常終了した。

このプログラムは、1つの接続で通信を行うことを想定しています(2つの接続があったのは、想定外です)。
受信データを受け取る変数をメンバ変数として確保しています。サイズは、4096バイト(byteの配列)です。

お教えいただきたいのは、改善方法としてスレッドとして実行するメソッドで領域確保するのは、妥当でしょうか?

C言語の感覚から抜けきれないため、サイズの大きな変数をどのように確保するのが良いかが今一つ分からないです。

OS: Windows7 Pro.
言語: C# (Visual Studio 2005)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2016/04/22 05:54

「何」を改善したいのでしょうか? データ異常(ヘッダに書かれたデータ長と実際のデータ長が異なる等)が起きても、他の接続に影響がないようにしたいのならスレッドが有効です(実際、多くのWebサーバはそうなっています)。通信を1つの接続でのみ行いたいというのなら、2つ目の接続が行われないように工夫すべきでしょう。  目的がはっきりしないと、適切な回答が得られないと思いますよ。
fuoh

2016/04/22 09:43

改善したいのは、サイズの大きな領域を確保するため、どこに定義するかということです。現在、サイズの大きな領域をスレッドから個々の独立した領域として確保する方法。その方法としてメソッドのローカル変数は妥当なのか?というところで悩んでいます。
guest

回答1

0

ベストアンサー

こんにちは。

サイズの大きな領域を確保するため、どこに定義するかということです。

恐らく巨大変数なら配列で確保されると思いますが、配列もnewで確保します。
メンバ変数もローカル変数も同じように、配列やクラスのインスタンスはnewで確保しますので、何故ローカル変数で巨大領域を確保することを懸念されているのか、良く分かりません。

C言語と比較されているので、もしかして、スタックから巨大変数領域を獲得してしまい、スタック・オーバーフローが起きないか恐れているということでしょうか?
C#にてnewで多数の巨大領域(数10MBytes単位)を獲得したことありますが、スタック・オーバーフローが起きたことはありません。画像処理する際、画像を読み込むためのテンポラリ領域をローカル変数として定義することは普通に行ってました。

もし、恐れている問題がスタック・オーバーフローでないようでしたら、もう少し具体的に何を恐れているのか書いて頂けると回答しやすいです。

投稿2016/04/22 12:53

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuoh

2016/04/22 13:41

「スタック・オーバーフロー」を懸念していました。 ご回答ありがとうございます。 ご回答をいただくためのアドバイスをいただいた方へ、この場を借りましてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問