ページ 11

関数のスレッド化とは

Posted: 2013年12月12日(木) 21:11
by ネコボブ
Visual Studio 2005 、Winsock でTCPソケット通信のプログラミングに挑戦しています。
シングルスレッドによる複数クライアントは一応できたのですが、マルチスレッドがうまくいきません。

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

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

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

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

Posted: 2013年12月12日(木) 21:39
by ネコボブ
メインをselectでまわして、
イベントがあればA関数を呼び出しacceptさせて、
メッセージがあればB関数を呼び出してrecvとsendさせる

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

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

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

Posted: 2013年12月13日(金) 23:32
by shiro4ao
>関数のスレッド化とはサブ関数を作るということでいいのでしょうか?
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: 関数のスレッド化とは

Posted: 2013年12月16日(月) 20:45
by ネコボブ
selectとマルチスレッドは違うですね。勉強になります。
時間が空いてしまいましたがお二人ともありがとうございます。