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

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

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

Re[15]: VB.NETマルチスレッドの名前指定と終了


(過去ログ 29 を表示中)

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

■13043 / inTopicNo.1)  VB.NETマルチスレッドの名前指定と終了
  
□投稿者/ モー (1回)-(2008/01/23(Wed) 20:34:28)

分類:[VB.NET/VB2005] 

現在VB.NETにてマルチスレッドの構築を行っています。

内容としては

アプリ起動後、複数スレッドを起こし、それぞれに名前を付け同時に動作させつつ、

その中の指定したスレッド一つをボタンイベントで強制終了したいのですが、

その指定(取得)の仕方が分かりません。

ご教授下さい。


==概略ソース==

Public Class Form1

Dim cls As New TaskClass
Dim thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf cls.PageChange))

   thread1.start()
   thread1.Name = strName

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

''★ここで希望の名前のスレッドを強制終了したいです

End Sub
End Class

Class TaskClass
Sub PageChange()

End Sub
End Class

引用返信 編集キー/
■13047 / inTopicNo.2)  Re[1]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ シャノン (270回)-(2008/01/23(Wed) 21:05:47)
No13043 (モー さん) に返信
> 現在VB.NETにてマルチスレッドの構築を行っています。
>
> 内容としては
>
> アプリ起動後、複数スレッドを起こし、それぞれに名前を付け同時に動作させつつ、
>
> その中の指定したスレッド一つをボタンイベントで強制終了したいのですが、
>
> その指定(取得)の仕方が分かりません。
>
> ご教授下さい。

どうも、現在のプロセス中の Thread オブジェクトを列挙する方法は無いみたいです。
また、スレッドの強制終了というのは望ましいことではありません。
スレッドは、継続フラグが立っている限りループ処理して、継続フラグがOFFになったら、スレッドプロシージャ(Threadクラスのコンストラクタに渡したデリゲートに結びつくメソッド)からReturnするという形で自然に終了すべきです。
TaskClassのメンバ変数として、スレッド名と継続フラグのペアを用意しておき、各スレッドプロシージャは、ループを1回終える度にそのペアを自分のスレッド名で参照して、フラグがOFFになっていたらReturnするというのが良いのではないでしょうか。
引用返信 編集キー/
■13054 / inTopicNo.3)  Re[2]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ モー (3回)-(2008/01/23(Wed) 22:34:40)
No13047 (シャノン さん) に返信

> どうも、現在のプロセス中の Thread オブジェクトを列挙する方法は無いみたいです。
> また、スレッドの強制終了というのは望ましいことではありません。
> スレッドは、継続フラグが立っている限りループ処理して、継続フラグがOFFになったら、スレッドプロシージャ(Threadクラスのコンストラクタに渡したデリゲートに結びつくメソッド)からReturnするという形で自然に終了すべきです。
> TaskClassのメンバ変数として、スレッド名と継続フラグのペアを用意しておき、各スレッドプロシージャは、ループを1回終える度にそのペアを自分のスレッド名で参照して、フラグがOFFになっていたらReturnするというのが良いのではないでしょうか。


シャノンさんありがとうございます。

強制終了が好ましくないことは承知しておりますが、実際問題として10個のスレッドを同時に動作している最中に
そのうちの1個だけがフリーズした場合にそれを終了させ、残りの9個は動作させ続けたいのです。

またそのフリーズしたスレッドからは信頼できる情報が取得できるとは限らないので、外部から強制終了するしかないと思います。

そうした場合に、ボタンイベントで外部からthread1.Name等を用いて???.Abort()のような記述で終了させられないかと悩んでいます。
もし代替案や同等の記述がありましたら教えて頂けませんか?

引用返信 編集キー/
■13056 / inTopicNo.4)  Re[3]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ 片桐 (61回)-(2008/01/23(Wed) 23:09:48)
片桐 さんの Web サイト
あー、強制的にこのアプリ落としたい、ってことですね<おい

簡単な方法としては、アプリを列挙して、該当タイトルもしくはハンドルを持つアプリを引っ張ってきて落とす、という手順ですが

落とすアプリから見て、
落としたいアプリのWindowハンドルもしくはスレッドハンドルが取得可能(アクセス可能)である
落とすアプリの実行ユーザーが、落としたいアプリと同一ユーザーもしくはアドミニストレーター
という条件がそろって初めて、

問題のアプリにWindowハンドルがいるならWindowCloseの処理、スレッドならスレッドAbortで実装できるんじゃないかと思います

まぁそれもできて、実装したとして、強制終了する命令、つまりシグナルを落としたいアプリが受け取れる状態になければ逆に負荷をかけてしまうリスクもありますが……

そのあたりの問題はクリアでしょうか?


引用返信 編集キー/
■13057 / inTopicNo.5)  Re[3]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ れい (376回)-(2008/01/23(Wed) 23:13:30)
No13054 (モー さん) に返信
> 強制終了が好ましくないことは承知しておりますが、実際問題として10個のスレッドを同時に動作している最中に
> そのうちの1個だけがフリーズした場合にそれを終了させ、残りの9個は動作させ続けたいのです。

そもそもフリーズすることがおかしいので、
普通ならそういう「実際問題」になることはありません。
そういう場合には、フリーズしたらどうするか、ではなく、フリーズしないように考えます。

> またそのフリーズしたスレッドからは信頼できる情報が取得できるとは限らないので、外部から強制終了するしかないと思います。
> そうした場合に、ボタンイベントで外部からthread1.Name等を用いて???.Abort()のような記述で終了させられないかと悩んでいます。

どうしてもやりたいなら、
DictionaryやHashTableにスレッド名とスレッドオブジェクトを入れておいて、
それを参照して殺せばいいのではないでしょうか?

private threadlist as Dictionary(Of String, Thread)

Private Sub XXX()
dim thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf cls.PageChange))
thread1.start()
threadlist.Add(strName, thread1)
End Sub

...

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

if threadlist.Contains(textbox1.text) then
threadlist(textbox1.text).Abort
end if

End Sub

激しく適当ですが、こんな感じで。

引用返信 編集キー/
■13061 / inTopicNo.6)  Re[4]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ れい (377回)-(2008/01/24(Thu) 00:01:13)
No13056 (片桐 さん) に返信
> あー、強制的にこのアプリ落としたい、ってことですね<おい

アプリとは書いてないので、
ただのスレッドだと思います。
引用返信 編集キー/
■13072 / inTopicNo.7)  Re[5]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ 七曜 (42回)-(2008/01/24(Thu) 03:07:24)
if threadlist.Contains(textbox1.text) then
 threadlist(textbox1.text).Abort
end if

は、threadlist.ContainsKey(textbox1.text)かな。
あとは、Abortした後のDictionaryの掃除が必要かもしれませんね。

引用返信 編集キー/
■13460 / inTopicNo.8)  Re[6]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ モー (5回)-(2008/01/29(Tue) 21:13:49)
No13072 (回答して頂いた各位) に返信
> if threadlist.Contains(textbox1.text) then
>  threadlist(textbox1.text).Abort
> end if
>
> は、threadlist.ContainsKey(textbox1.text)かな。
> あとは、Abortした後のDictionaryの掃除が必要かもしれませんね。
>


皆様ありがとうございます。
今作りたいのは1ポート(1アプリ)に複数スレッドを作成することです。

フリーズしないように作ることは尤もですが、万が一起きた場合に外部イベントから
1スレッドのみ強制終了することもしたいのです。

以下のスケルトンでデバッグモードで動かしているのですが、ボタンイベント時のAbort()が通りはしますが
スルーしてしまいます。

ちなみにフリーズ状態に見立てるためにある場合だけPageChange()で数十秒Sleepさせており、そのタイミングで
ボタンイベントを発生させています。

Dictionaryの使い方は問題無いと思うのですが、他に原因があれば皆様の知恵を貸して下さい。



Public Class Form1
Public dic As New Dictionary(Of String, System.Threading.Thread)
Public pIP As String
 ・
 ・
 ・
Private Sub DataArrive(ByRef pHtIp As String, ByRef pWinNo As Short) Handles HtCtrl.HtDataArrival
Dim cls As New TaskClass
Dim thread1 As New System.Threading.Thread(New System.Threading.ThreadStart(AddressOf cls.PageChange))

thread1.Start()

dic.Add(pIP,thread1)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'スレッドクラスを呼び出し、強制終了する
dic.Item(pIP).Abort()

End Sub

End Class

Class TaskClass

Sub PageChange()

End Sub

End Class
引用返信 編集キー/
■13468 / inTopicNo.9)  Re[7]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ なちゃ (102回)-(2008/01/29(Tue) 22:17:42)
スレッドが終了出来ていないことはどうやっていつ確認してます?
Abortは同期的にスレッドを終了させる訳ではありません。
また状況によっては終了するまで長い時間かかる場合もありますし
状況によっては終了できないこともありえます。

引用返信 編集キー/
■13480 / inTopicNo.10)  Re[8]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ モー (6回)-(2008/01/30(Wed) 01:59:25)
No13468 (なちゃ さん) に返信
> スレッドが終了出来ていないことはどうやっていつ確認してます?
> Abortは同期的にスレッドを終了させる訳ではありません。
> また状況によっては終了するまで長い時間かかる場合もありますし
> 状況によっては終了できないこともありえます。
> 

スレッドの終了はsleepの前後にConsolewrite()を用いてコメントを出力しています。

このコメントでトレースしています。

なちゃ さんのおっしゃっているのはAbort()自体に信頼性がない不確実なメソッドだということですか?


引用返信 編集キー/
■13481 / inTopicNo.11)  Re[9]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ やじゅ (70回)-(2008/01/30(Wed) 02:42:57)
やじゅ さんの Web サイト
No13480 (モー さん) に返信
>
> 'スレッドクラスを呼び出し、強制終了する
> dic.Item(pIP).Abort()
>

問題ないと思われますが、一応dicを使わずに
thread1.Abort() としても、スルーするかどうか?
引用返信 編集キー/
■13483 / inTopicNo.12)  Re[10]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ 七曜 (57回)-(2008/01/30(Wed) 05:21:05)
No13480 (モー さん) に返信

>なちゃ さんのおっしゃっているのはAbort()自体に信頼性がない不確実なメソッドだということですか?

[スレッドの破棄]
http://msdn2.microsoft.com/ja-jp/library/cyayh29d(vs.80).aspx

に書いてありますが、
 Abort() -> 終了処理 -> 制御が戻る
ではないので、
 Abort() -> 終了命令(とでもしておきましょう) -> 制御が戻る
で、Abortされた側のスレッドは、終了処理をしてから停止するので
場合(実装の仕方)によっては、終了しない場合もあり得るということになるかな。

簡単なサンプル書いてみました。ThreadFuncYはAbort()後も動いている事が確認出来るかと。


    Private dicThreads As New Dictionary(Of String, Thread)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim thread As Thread

        thread = New Thread(New ThreadStart(AddressOf ThreadFuncX))
        thread.Start()
        dicThreads.Add("X", thread)
        thread = New Thread(New ThreadStart(AddressOf ThreadFuncY))
        thread.Start()
        dicThreads.Add("Y", thread)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim KVP As KeyValuePair(Of String, Thread)
        For Each KVP In dicThreads
            Console.WriteLine("{0} Abort!:{1}", KVP.Key, DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
            KVP.Value.Abort()
        Next
    End Sub

    Private Sub ThreadFuncX()
        While (True)
            Try
                Thread.Sleep(3000)
                Console.WriteLine("ThreadFuncX execuing!:{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
            Catch ex As ThreadAbortException
                Continue While
            End Try
        End While
    End Sub

    Private Sub ThreadFuncY()
        Try
            While (True)
                Thread.Sleep(3000)
                Console.WriteLine("ThreadFuncY execuing!:{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
            End While
        Catch ex As ThreadAbortException
            While (True)
                Thread.Sleep(3000)
                Console.WriteLine("ThreadFuncY(2) execuing!:{0}", DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"))
            End While
        End Try
    End Sub

引用返信 編集キー/
■13488 / inTopicNo.13)  Re[9]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ NyaRuRu (31回)-(2008/01/30(Wed) 09:33:08)
No13480 (モー さん) に返信
>
> なちゃ さんのおっしゃっているのはAbort()自体に信頼性がない不確実なメソッドだということですか?

確実にスレッドを殺すというのは,実装上非常に難しい問題で,残念ながら CLR はその難しさを完全に隠蔽してくれてはいません.
結果として Abort の信頼性は著しく低いです.

「using 構文使用時に Dispose が呼出されない確率」
http://d.hatena.ne.jp/NyaRuRu/20060605/p1

「finally 句と ThreadAbort」
http://d.hatena.ne.jp/NyaRuRu/20060531/p1

「ThreadAbort と EscalationPolicy」
http://d.hatena.ne.jp/NyaRuRu/20060602/p1

以下のコードは .NET 1.x と 2.x で挙動が異なり,かつ 2.x では永遠に停止しません.

using System;
using System.Threading;

namespace ThreadAbortTest
{
    class Program
    {
        static void Proc()
        {
            try
            {
                try
                {
                }
                finally
                {
                    Thread.Sleep(Timeout.Infinite);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception " + e.ToString());
                throw;
            }
        }
        static void Main(string[] args)
        {
            Thread worker = new Thread( new ThreadStart(Proc) );
            worker.Name = "Worker Thread";
            worker.Start();
            Thread.Sleep(1000);
            worker.Abort();   // ← ここで無限に停止する (.NET Framework 2.0)
            worker.Join(1000);
            Console.WriteLine("Joined");
        }
    }
}

引用返信 編集キー/
■13543 / inTopicNo.14)  Re[10]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ モー (7回)-(2008/01/30(Wed) 23:10:56)
No13488 (七曜 さん、NyaRuRu さん) に返信

ありがとうございます。

Abort()の不確実性は確認できました。

利用する上で大変勉強になりました。

ちなみに七曜さんのサンプルの

Dim KVP As KeyValuePair(Of String, Thread)

のFor文で回さずにKVPに特定のキー値を指定してそのThreadオブジェクトだけにKVP.Value.Abort()を
実行させることは可能でしょうか?




引用返信 編集キー/
■13545 / inTopicNo.15)  Re[11]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ れい (403回)-(2008/01/30(Wed) 23:24:14)
No13543 (モー さん) に返信
> ちなみに七曜さんのサンプルの
>
> Dim KVP As KeyValuePair(Of String, Thread)
>
> のFor文で回さずにKVPに特定のキー値を指定してそのThreadオブジェクトだけにKVP.Value.Abort()を
> 実行させることは可能でしょうか?

ForでまわすためだけにKeyValuePairを用意してるので、
まわさないなら普通にKeyを指定すればいいだけです。

No13072 (七曜 さん)
を参照したらよいかと。
引用返信 編集キー/
■13605 / inTopicNo.16)  Re[12]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ モー (8回)-(2008/01/31(Thu) 20:50:17)
2008/01/31(Thu) 21:50:15 編集(投稿者)
2008/01/31(Thu) 21:16:32 編集(投稿者)
2008/01/31(Thu) 21:16:24 編集(投稿者)

No13545 (れい さん) に返信

皆様ありがとうございます。

今回のシステム構造としてはクラサバ関係でサーバーにあるexeのコード中にスレッドは1つだけあり、それに複数のクライアントが
アクセスしにくることになっていました。スレッドに排他制御等はかけず、場合によっては同じスレッドをほぼ同時に多数動かす
場合も想定しています。

その為、万が一、そのうちの1クライアントのアクセスが1スレッド内でフリーズしたとしたら、他のクライアントに影響が
出ないかと考えておりました。

ちなみに同じクラスにあるスレッドを開始する際に引数を渡したいのですが、教えて頂きたいです。
同クラス内での共通変数使う手段はありますが、複数スレッドあることであるスレッドが処理中に絶妙なタイミングで他のアクセス
したクライアントが共通変数を変えてしまう恐れがある為です。

別クラスの場合はFriend 変数を用いて実現できました。

(同一のスレッドを時間差で呼び出し、先に動き出したスレッドがフリーズした場合、そのスレッドの変数データは後から動き出した
スレッドの処理により変化しないということを前提に必要としています)

引用返信 編集キー/
■13613 / inTopicNo.17)  Re[13]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ 七曜 (63回)-(2008/01/31(Thu) 22:36:48)
No13605 (モー さん) に返信
> 今回のシステム構造としてはクラサバ関係でサーバーにあるexeのコード中にスレッドは1つだけあり、それに複数のクライアントが
> アクセスしにくることになっていました。スレッドに排他制御等はかけず、場合によっては同じスレッドをほぼ同時に多数動かす
> 場合も想定しています。

多くの場合(Soket使う場合なんかですけど)、
リスナスレッド(クライアントからのリクエストをリッスンするスレッド)がリクエストを受けたら
処理用スレッドを生成/開始し、必要なデータを取得/処理する・・・といった感じになるような・・・。
割とメジャーな処理なので、通信プログラミング系の書籍なんかも多くありますね。

> その為、万が一、そのうちの1クライアントのアクセスが1スレッド内でフリーズしたとしたら、他のクライアントに影響が
> 出ないかと考えておりました。

ですので、クライアント/サーバ型では、1スレッドで処理する事はスケーラビリティやアベイラビリティの関係でやりません。

> ちなみに同じクラスにあるスレッドを開始する際に引数を渡したいのですが、教えて頂きたいです。
> 同クラス内での共通変数使う手段はありますが、複数スレッドあることであるスレッドが処理中に絶妙なタイミングで他のアクセス
> したクライアントが共通変数を変えてしまう恐れがある為です。

これも多くの場合、別のインスタンス(実体)を使用する様にデザイン/インプリメントされます。


> (同一のスレッドを時間差で呼び出し、先に動き出したスレッドがフリーズした場合、そのスレッドの変数データは後から動き出した
> スレッドの処理により変化しないということを前提に必要としています)

これは・・・前提が・・・怪しいですね。
先に動いたスレッドが必ず先に処理される、というのは、たまたまそう動いて見えているだけかもしれません。


さて、スレッドに引数を渡す方法ですが

[スレッドを作成し、開始時にデータを渡す]
http://msdn2.microsoft.com/ja-jp/library/ts553s52(VS.80).aspx

にあるように、ParameterizedThreadStartを使うか、スレッド プロシージャとデータをヘルパー クラスにカプセル化し、ThreadStartを使う方法があります。

蛇足ですが、.NETでスレッド処理をされるのであれば、
[マネージ スレッド処理]
http://msdn2.microsoft.com/ja-jp/library/3e8s7xdd(VS.80).aspx
をご一読される事をお薦めします。
引用返信 編集キー/
■13641 / inTopicNo.18)  Re[14]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ れい (408回)-(2008/02/01(Fri) 04:57:00)
No13605 (モー さん) に返信
> 今回のシステム構造としてはクラサバ関係でサーバーにあるexeのコード中にスレッドは1つだけあり、それに複数のクライアントが
> アクセスしにくることになっていました。スレッドに排他制御等はかけず、場合によっては同じスレッドをほぼ同時に多数動かす
> 場合も想定しています。

よくわかりません。
exeのコード内にスレッドが一つだけなら、
排他制御も何もいりません。

スレッドは一つなのですか?複数なのですか?

> その為、万が一、そのうちの1クライアントのアクセスが1スレッド内でフリーズしたとしたら、他のクライアントに影響が
> 出ないかと考えておりました。

サーバーのスレッドが一つであれば間違いなく問題になります。
サーバーのスレッドが複数であれば、問題にならない場合もありますが、大抵は問題になります。

> ちなみに同じクラスにあるスレッドを開始する際に引数を渡したいのですが、教えて頂きたいです。

System.Threading.Thread.Start(Object)というメソッドが一番簡便だと思いますが、

七曜さんの言うように、
> にあるように、ParameterizedThreadStartを使うか、スレッド プロシージャとデータをヘルパー クラスにカプセル化し、ThreadStartを使う方法があります。
データをカプセル化して渡してもよいと思います。

全般に、スレッドについて理解が浅いように感じます。
簡単なアプリなどを作ったりして勉強してからもう一度設計したほうがよいと思います。


No13613 (七曜 さん) に返信
> 多くの場合(Soket使う場合なんかですけど)、
> リスナスレッド(クライアントからのリクエストをリッスンするスレッド)がリクエストを受けたら
> 処理用スレッドを生成/開始し、必要なデータを取得/処理する・・・といった感じになるような・・・。
> 割とメジャーな処理なので、通信プログラミング系の書籍なんかも多くありますね。

1スレッド1接続というのはスレッドやソケットの入門書籍ではよくありますが、
私の知りうる限り、ある程度信頼の置けるソフトでは殆どありません。
規模の大きいもの(IISやapacheなど)では多スレッド多接続、
規模の小さいものは1スレッド多接続が多いように思います。

スレッド切替や排他制御にはかなりのコストがかかります。
パフォーマンス的にも、開発工程的にも、見合うためにはかなり巨大でなければいけません。

> ですので、クライアント/サーバ型では、1スレッドで処理する事はスケーラビリティやアベイラビリティの関係でやりません。

クライアント/サーバーでも、1スレッドで処理する事は私の知りうる限りではよくあります。
スケーラビリティやアベイラビリティを確保のしやすさと
上記のコストを天秤にかけ、判断することになります。

話を聞く限りでは、
モーさんの場合はスレッドを使うこと自体を再考したほうがよいと思います。

Abortが必要である点、排他制御をよく理解していなそうな点などを考慮すると、
マルチスレッドで開発をすると大変なことになりそうだと思います。
引用返信 編集キー/
■13673 / inTopicNo.19)  Re[15]: VB.NETマルチスレッドの名前指定と終了
□投稿者/ 七曜 (66回)-(2008/02/01(Fri) 12:12:24)
No13641 (れい さん) に返信
> ■No13613 (七曜 さん) に返信
>>多くの場合(Soket使う場合なんかですけど)、
>>リスナスレッド(クライアントからのリクエストをリッスンするスレッド)がリクエストを受けたら
>>処理用スレッドを生成/開始し、必要なデータを取得/処理する・・・といった感じになるような・・・。
>>割とメジャーな処理なので、通信プログラミング系の書籍なんかも多くありますね。
>
> 1スレッド1接続というのはスレッドやソケットの入門書籍ではよくありますが、
> 私の知りうる限り、ある程度信頼の置けるソフトでは殆どありません。
> 規模の大きいもの(IISやapacheなど)では多スレッド多接続、
> 規模の小さいものは1スレッド多接続が多いように思います。

(モーさんのスレッドで質問するのは、恐縮ではありますが・・・)
不勉強なので、ご教授いただきたいのですが

[Bind→Listen→Accept(Socketが出来る)->(送)受信用Thread生成]->(Soket)->[(送)受信]

[]がスレッド境界だとして、前をリスナスレッド、後を処理用スレッド、というイメージで書いていますが、
多くの場合、サーバー側の処理実装は、上記の様な構造になるかと思っています。
Socketが複数なので、C-S間の接続は複数ですよね。(入門書レベルでもこのくらいは書いてあるような。)

「多スレッド多接続」と言われているのは、上記で言うところのリスナスレッドが複数スレッドある、
ということなのだと思いますが、同じエンドポイントに対して、多数Bind出来るということでしょうか。

> スレッド切替や排他制御にはかなりのコストがかかります。
> パフォーマンス的にも、開発工程的にも、見合うためにはかなり巨大でなければいけません。
>
>>ですので、クライアント/サーバ型では、1スレッドで処理する事はスケーラビリティやアベイラビリティの関係でやりません。
>
> クライアント/サーバーでも、1スレッドで処理する事は私の知りうる限りではよくあります。
> スケーラビリティやアベイラビリティを確保のしやすさと
> 上記のコストを天秤にかけ、判断することになります。

C/Sといっても必ずしも多対1や多対多ではなく1対1である場合もありますし、これは要件次第なのだと思います。
(断定的に「やりません」と書いたのが良くなかったですね。)
で、今回の要件的には

> 今作りたいのは1ポート(1アプリ)に複数スレッドを作成することです。

ということだったので、まぁ(私がそうだと思っているだけですが)基本型で良いのかなぁ、と考えた次第です。


(ここからはモーさん宛だと思いますが・・・)

> 話を聞く限りでは、
> モーさんの場合はスレッドを使うこと自体を再考したほうがよいと思います。
>
> Abortが必要である点、排他制御をよく理解していなそうな点などを考慮すると、
> マルチスレッドで開発をすると大変なことになりそうだと思います。

そこら辺は、知識と経験がものを言うでしょうから、良い機会なので
基本的な知識の理解と経験への手助けになれば、良いんじゃないでしょうかね。
その上で、ご自身のスキルで出来そうか出来そうかは判断していただければ良いかと・・・。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -