関数のスレッド化とは

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ネコボブ

関数のスレッド化とは

#1

投稿記事 by ネコボブ » 11年前

Visual Studio 2005 、Winsock でTCPソケット通信のプログラミングに挑戦しています。
シングルスレッドによる複数クライアントは一応できたのですが、マルチスレッドがうまくいきません。

教授曰く、関数をスレッド化するだけとのことですが、関数のスレッド化とはサブ関数を作るということでいいのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 関数のスレッド化とは

#2

投稿記事 by h2so5 » 11年前

スレッド化というのは関数を並行実行できるようにすることです。サブ関数は関係ないです。
TCPソケット通信の場合は、一般的にはコネクションごとにスレッドを割り当てるということだと思われます。

ネコボブ

Re: 関数のスレッド化とは

#3

投稿記事 by ネコボブ » 11年前

メインをselectでまわして、
イベントがあればA関数を呼び出しacceptさせて、
メッセージがあればB関数を呼び出してrecvとsendさせる

って考えているのですが、このAやBはサブ関数ではないんですよね?

スレッドを割り当てるのとはどうのように違うのでしょうか?

アバター
shiro4ao
記事: 224
登録日時: 15年前
住所: 広島

Re: 関数のスレッド化とは

#4

投稿記事 by shiro4ao » 11年前

>関数のスレッド化とはサブ関数を作るということでいいのでしょうか?
h2so5さんが仰る通りちょっと違うものだと思います。

[シングルスレッド 従来のやり方]
selectを使って行っているやり方のイメージは
店員が一人しかいない家電量販店のようなものです
たくさんのクライアントからの通信をAというスレッドが三面六臂の活躍で面倒を見ています

[マルチスレッド 新しい方法]
一方マルチスレッドを使うとたくさんの人でクライアントの面倒を見る感じです
やってくるクライアントをとりあえず処理する、その後は新しく作ったスレッドに任せる(=スレッドA)
1人目のクライアントはBさん(=スレッドB)が面倒を見る
2人目のクライアントはCさん(=スレッドC)が面倒を見る
3人目のクライアントはDさん(=スレッドD)が面倒を見る
のように作ることができます。
店員が複数いるてお客さんに個別に対応している家電量販店のようなものです
(そんな家電量販店は聞いたことありませんが…(;^ω^A)

あまり変わらないように見えるのですが、例えば上のパターンで
あるクライアントの実行している処理が時間がかかったとします。
そうなるとAさんはそのクライアントにつきっきりになってしまいます
他のクライアントは面倒を見てもらえません、処理を頼んでも無視されてしまいます

しかし、マルチスレッドにすればAさんの担当しているクライアントがどれだけ時間をかけようが
ほかのB,C、Dの担当しているクライアントに関係ないのでB,C,Dはいつでも処理を実行できます

なのでマルチスレッドの方が便利です
(マルチスレッドはデメリットもたくさんあるのですが…)

具体的な方法ですが
WinsockなのでWindowsだと思いますが
CreateTread関数を使います。(beginthreadexとかもあるのですが…)

コード:

//クライアントが来たら通信を処理するスレッドを立てる
//家電量販店の店員が足りない時は店員を作る
CreateThread(NULL , 0 ,  TenninThread ,(LPVOID)p, 0 ,NULL);

実際に作ったスレッドでどういう処理をするのかは以下に書いておきます
DWORD WINAPI TenninThread(LPVOID lpvoid ) {
	//クライアントごとにやってほしい処理を書く
	//家電量販店の店員がやらないといけないこと
}

ネコボブ

Re: 関数のスレッド化とは

#5

投稿記事 by ネコボブ » 11年前

selectとマルチスレッドは違うですね。勉強になります。
時間が空いてしまいましたがお二人ともありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る