• ベストアンサー

スレッドセーフ

VS.netを使用している開発初心者です。 スレッドセーフな実装をする・・と言っても、具体的にどんなことをすればいいのかわかりません。みなさんが気をつけている点やテクニックなど何でもいいので教えてください。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

簡単に言うと 1.参照のみと言う場合を除き、静的な変数は扱わない。 2.参照のみと言う場合を除き、ファイルを扱う場合は排他で開く。 3.更新を前提としてDBを読み込む場合はレコードをロックする。 4.「スレッドセーフでない」APIを使用しない。 これくらいで十分でしょう。

goouser20
質問者

お礼

ありがとうございます! 漠然としていたのがすっきりしました。 感謝です!

その他の回答 (1)

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

カテ違いかもしれませんので、C/C++かVBのカテゴリーで再度質問されると回答がつくかもしれません。 さて、私はスレッドセーフというと、マルチスレッドにおいて、リソースに対して同時にアクセスるのを対処しているという事であると理解していますが、それについて書いてある本に以下のものがあります。 c#.NETアプリケーション開発 徹底攻略 伊藤真二著 http://www.amazon.co.jp/NET%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-NET-Framework-3-5%E5%AF%BE%E5%BF%9C/dp/4839930422/ref=sr_1_1?ie=UTF8&s=books&qid=1254126831&sr=1-1 参考になればよいですが。

goouser20
質問者

お礼

ありがとうございます。 読んでみます!

関連するQ&A

  • TRACEのスレッドセーフにつきまして

    .NETでWebアプリケーションを開発しています。 ログファイルを出力する際に、TRACEを使用しようとしてサンプルを作成し、ログファイルが出力されることも確認しました。 そのTRACEを使うため、.NETのヘルプを見ながら サンプルを作成したのですが、ここに「TRACEはスレッドセーフである」との 説明がありました。 ここで言う「スレッドセーフ」とは、同時にログファイルへ 書き込みにいっても、ログファイルが壊れないという意味に 受け取ってもよろしいのでしょうか。 以上よろしくお願いします。

  • スレッドセーフでないAPIをマルチスレッドで使う

    ASP.NET + C#でシステムを開発しているのですが、別システムから提供されている スレッドセーフでないAPIを利用しなければならなくなりました。 (このAPI自体は別のシステム会社が提供しており、改修することができません。) APIは別システムへのログイン、各種情報取得、ログアウトを提供していますが、 セッション管理部分が共有(staticになっている?)されているらしく、あるスレッドが ログインした直後に別スレッドがログアウトすると、先のスレッドでの情報取得が セッション切れでエラーになってしまいます。 このような場合、どのような解決方法が一般的でしょうか? 具体的にご教示いただけると幸いです。

  • スレッドの監視方法

    MFCを使ってマルチスレッドプログラミングを行う予定です。 そこで質問なのですが、皆さんがマルチスレッドのプログラミングを行う際 どのようにしてスレッドの状態を監視していますか? VisualStudio中にスレッドの状態を監視する方法があるのでしょうか? また、スレッドの状態を監視する定番ツールのようなものはあるのでしょうか? 定番ではなくても便利なツールがあったら有料でも構いませんので教えて下さい。 マルチスレッドプログラミングは少ししか経験がありません。 お勧めの書籍などあったら教えて頂けると助かります。 どうぞ宜しくお願い致します。 環境:WindowsXP + VS6のMFC(後にVS2100使用予定)

  • サーブレットのスレッド管理について

    はじめまして、現在Web Developperを目指し日々サーブレット,JSP, JavaBeansの勉強を続けております。お聞きしたいことは、サーブレット, JavaBeansのスレッド管理です。個人で勉強していると多数のクライアントが一つのサーバーにアクセスするなどという 環境をつくりずらいので、業務経験のあるかたからアドバイスをいただきたいです。 現在スレッドを管理する方法とて,SingleThreadModel インターフェイスの実装かsyncronizedコードを利用できることを知っております。 質問1. 実際のシステムで使われているスレッド管理もこの二つの方法で行われているのでしょうか? 質問2. JDBCよりデータベースに書きこむ部分は、二つのスレッドが同時にDBのデータを書き込まないように、shncronizedコードで囲まなくてはいけないと学びましたが、他の本でDBにはすでに同時アクセス を防ぐ仕組みがあるから、synchronizedコードを書かなくてもよいとかいてありました。どちらが正しいのでしょうか? 質問3. 業務のスレッド管理で主に気をつけなければいけないところは、DBとローカル変数がスレッドセーフになっていることでしょうか、他にも注意するべき点がありますでしょうか? 初心者の質問ですので、的を得ていないところが多々あると思います。それでも少しでも、技術者の方に近づければと思い質問させていただきました。もしよろしければご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • スレッドセーフなクラスのサブクラスは? synchronizedって継承先では?

    1)メソッドにsynchronizedキーワードをつけた時、継承先のサブクラス側でもsynchronizedは生きているのでしょうか? 2)もし生きていると サブクラス側で、synchronizedをとりけしたい場合 synchronizedをつけない形でオーバーライドして 中身の実装は super.メソッド名(); だけにするという方法しかないということでしょうか? 3)なお、 サブクラス側で、synchronizedキーワードを追加しながら メソッドのオーバーライドができるということは 知っています。 4) (1)の答えが生きていない。とすれば・・。 スレッドセーフなクラスをがんばって作成しても、 サブクラス作成者がいちいち意識しなければ、 サブクラスはスレッドアンセーフになってしまう ということでしょうか? サブクラス作成者がたとえ、赤の他人でまったく、 コミュニケーションをとれない状況であろうとも、 そうならないようにするためのしかけを 作るためのテクニックはあるでしょうか? なお、これはクラスをfinalしたくない場合の話です 以上です。

    • ベストアンサー
    • Java
  • スレッドでのシグナルの使用について

    linux初心者なので、困っています。助けてください。 スレッドが複数登録してある状態で、特定のスレッドのみでシグナルを受信したいのですが、可能でしょうか? また、使用する際の注意点なども教えて頂けたらお願いします。

  • スレッドセーフな関数readdir_rに関して

    C言語初心者です。 readdirにてディレクトリ検索を実施しようと思ったのですが、 スレッドセーフな関数ではないとのことから、 readdir_rにてプログラミングを行う予定でいます。 しかし、関数を調べてみたところ、パラメータが何をさしているのか、 リターン値は何を返すのか等の情報がどこにも見当たりません。 現在わかっているのは、下記の定義であることのみです。 int readdir_r (DIR *, struct dirent *, struct dirent **) こんなことを聞くのは場違いかもしれませんが、 readdir_rの仕様をご存じの方、もしくは説明が書かれている Webをご存じの方、大変申し訳ございませんが、 ご教授頂けますよう宜しくお願い致します。

  • ASP.NETの開発スタイルについて

    ASP.NETを開発にはエディタ、WebMatrix、VS.NETが あるようですが、使い分けがわからないです。 みなさんはどのようにして開発してますでしょうか。 どのような開発スタイルが一般的なのでしょうか。 また疑問点はVS.NETでジェネレートしたコードを エディタやWebMatrixなどで改変しても、その後再び VS.NETで問題なく読み込めますでしょうか? つまり以下のようにシームレスに開発可能でしょうか?    ---------------------   ↓              ↓ エディタ←→WebMatrix←→VS.NET 初心者なので見当違いの質問かもしれませんが 教えてください。

  • C#のスレッド動作について

    下記はスレッドの中で永久ループさせるテストプログラムで、1秒毎にテキストボックス内の数値をインクリメントします。 【問題点1】 ※1と※2のコマンドを削除した状態(※3のみ)で正常な動作を期待していたのですが、実際にはフリーズ状態となり、カウント値が表示されません。 ※2のApplication.DoEvent()を実装するか、※3の替わりに※1に実装すると正常動作となります。 ExecThread実行中は他の処理を出来なくても、これを抜けた時点で表示処理に移るので表示される筈と思っていたのですが違う様です。 【問題点2】 Invokeの替わりにBeginInvokeを使えばExecThread実行中でも他の処理と並列処理されると思っていたのですが、スレッドを2個用意して試したところInvokeと全く変わらず、やはりフリーズ状態となります。 【問題点3】 ExecThreadを匿名メソッドにすると「フィールド初期化子は、静的でないフィールド、メソッド、又はプロパティ'iCount'を参照できません」のエラーとなり、「iCount」をstatic変数にするとOKになります。 匿名メソッドではインスタンス変数は使えないのでしょうか。 上記3項目についてネットで調べたのですがその様な記述は見当たりませんでした。 何か使い方が間違っているのでしょうか? 間違い点など、ご指摘頂ければ有難いです。 どうぞ宜しくお願いします。 private void ExecWorker() ← スレッド {   while (true)   {     Invoke(new Exec1Delegate(this.ExecThread)); ← BeginInvokeを使っても症状は同じ     iCount++;     Thread.Sleep(1000); ← ※1 このSleepが無いとフリーズする     Application.DoEvent(); ← ※2 これがあると※1のSleepが無くてもOK   } } delegate void ExecDelegate(); private void ExecThread() {   lbThread.Text = iCount.ToString(); ← 匿名メソッドにするとエラーになる   Thread.Sleep(1000); ← ※3 (※1のSleepと同時実装はしない) }

  • Postfixのスレッドごとに別々のIPアドレスを設定するには

    Postfixを使用してリレーメールサーバの開発を行っております。 そこで質問なのですが、Postfixのプロセスを1つ起動し、メール送信時に そのプロセス上のスレッドごとに違うIPを設定することは出来ますでしょうか? 以下のようなイメージになります。 ※IPは仮称です。 Postfix ├─Thread1(122.216.137.92) ├─Thread2(122.216.137.93) ├─Thread3(122.216.137.94) ├─Thread4(122.216.137.95) ├─Thread5(122.216.137.96) ├─Thread6(122.216.137.97) ├─Thread7(122.216.137.98) ├─Thread8(122.216.137.99) また、上記以外にも1つのPostfixプロセスでIPアドレスを変更しながらメールを 送信する手法はありますでしょうか? サーバは以下の構成です。 OS: Ledhat ES4 MTA: Postfix2.5 NICは2ポート空いております。 以上、宜しくお願い致します。