goo

サーバー側のコードがだいぶ揃ってきました。

サーバーを改造しやすいように、部品を色々作りました。

・安全に可変長の領域を確保できるクラス。
 安全のため、途中からのサイズ変更は不可。
 もちろん、スレッドセーフ。

・大量のデータ領域を安全に管理するクラス。
 途中からの要素数の変更は不可。
 要素の挿入では、どんなサイズでも受け付ける。
 もちろん、スレッドセーフ。

・ソケットの送信と受信を管理するクラス。
 受信は自動でしてくれます。
 もちろん、スレッドセーフ。

・ミューテックスを安全に管理するクラス。

だいたいこんな感じです。
コメント ( 20 ) | Trackback ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« やっぱり、ラ... 訳あって、サ... »
 
コメント
 
 
 
Unknown (Unknown)
2011-04-11 11:30:28
STL「……」
 
 
 
Unknown (ME By960)
2011-04-11 20:29:53
STLは、スレッドセーフが保証されていないので・・・。
 
 
 
Unknown (ME By960)
2011-04-12 00:59:15
あと、STLは書きにくい、拡張しにくい、デバグがしにくい。

スレッドセーフと排他制御を搭載した、バッファ用のクラスを書こうとすれば、
普通の配列もしくは、配列の長さを格納できるようにした配列格納クラスの方が使い勝手が良いです。
Vectorクラスはオーバースペックどころか、余計な物が付いていて・・・。

STLが、マルチスレッドを余り意識していないというか、
2つ以上のスレッドから参照しようとすれば、内容が見えなくて、使いにくくてしょうがない。

色々、STLのソースを見ながら考えるよりは、自分で作ったほうが、デバッグしやすい・・・。
 
 
 
Unknown (Unknown)
2011-04-12 08:43:18
仕様書「……」
継承「……」

Cテンプレート「え?なにかよう?」


Dテンプレート「YOU! こっちきちゃいなYO!」
 
 
 
Unknown (ME By960)
2011-04-12 18:01:34
継承したら、仕様の把握とオーバーロードの連続で1から作るよりしんどいです。
てか、排他制御しながらコピー取るのって、しんどくね?
 
 
 
Unknown (Unknown)
2011-04-12 18:24:37
解放漏れや別の参照に気をつけるよりはマシじゃね?
 
 
 
Unknown (shimalis)
2011-04-12 22:24:02
TBB?
 
 
 
Unknown (ME By960)
2011-04-13 00:04:04
開放漏れと参照の2重化は、気を付ければある程度簡単に防げるけど、
排他制御しながら operator= をオーバーロードしたりするのが、結構しんどい。
どちらかというと、設計の問題ですね・・・。

あと、試しにD言語で書いてみようかと。
D言語見たら、文字列の操作がかなり良い。
スレッドの排他制御に関しても、開放し忘れが起こりにくい。
ただ、マイナー言語のため、ライブラリがちょっと貧弱かも・・・。
これでは、2DゲームやサーバーやCGIくらいしか作れない・・・。
 
 
 
Unknown (Unknown)
2011-04-13 02:28:23
ライブラリが貧弱・・・?
たぶん、勘違いじゃないかな。

まあ、GUIに関しては、快適に使える状況じゃないけどww(工夫すれば使える)
 
 
 
Unknown (Unknown)
2011-04-14 00:10:55
サーバーにDMDが入らない・・・。

D言語のライブラリが貧弱ってのは、3Dに関してですね。
これらは、旧verまでしか使えませんね・・・。
OpenGL→1.0
DirectX→9.0c

コレ以外はC言語のライブラリが使えるので、余り困らないですが。
 
 
 
Unknown (Unknown)
2011-04-14 01:07:42
Linux版は確か、リンク処理はgccがやるとか書いてあったような。
それにしても、なんで旧バージョンのグラフィックスライブラリしか使えないと思ってるんだろう?
 
 
 
Unknown (Unknown)
2011-04-14 01:43:48
だめだ・・・。どうやってもDMDが入らない・・・。
gccのバージョンを上げたのに入ってないって言われる・・・。
普通にgccでコンパイルできるのに、動かない・・・。
必要なものも全部入れたのに・・・。

>それにしても、なんで旧バージョンのグラフィックスライブラリしか使えないと思ってるんだろう?
それは、旧バージョンのライブラリ使うページしか見つからないからです。
 
 
 
Unknown (Unknown)
2011-04-14 13:45:44
環境変数はちゃんと設定したかい?
PATH もしくは CC という名前の環境変数に、 GCC のリンカがあるパスを設定するんだ。
違う名前の変数に設定したり、設定の書式が間違ってたりすると、正しく動かないから注意だ!

>それは、旧バージョンのライブラリ使うページしか見つからないからです。
( ゜д゜)ポカーン
俺ね、OpenGLはCインターフェイスが、DirectXはCOMインターフェイスが実装されてるから、使えると思うんだ。
バージョン関係無く。
 
 
 
Unknown (ME By960)
2011-04-15 02:02:24
参考にできる文献が無いと、無いのと同じだと思いますよ。

あと、gccにちゃんとパスが通っていて、バージョンにも4.5.2と出ます。
もちろん、今までのソースのコンパイルも通りますし、動きます。
 
 
 
Unknown (Unknown)
2011-04-15 08:38:38
>参考にできる文献が無いと、無いのと同じだと思いますよ。
……そんな装備で大丈夫か?

>あと、gccにちゃんとパスが通っていて、
本当にちゃんと通ってる?
カレントディレクトリが、gccをインストールしたディレクトリじゃ 無 い 時に、
gcc
だけを入力したらちゃんとgccが起動するか?
起動するなら、俺の思いすごしかな・・・

しつこいって? でも俺は、これですごい悩んだ事があるからね・・・
こんな単純な事で、見当違いの文書を読み漁った三日間・・・
 
 
 
Unknown (Unknown)
2011-04-16 00:14:58
どこからやってもgccの4.5.2が呼ばれます。

DMDをrpm使わずに入れてみたら、
どうやら、CentOSに必要とするライブラリのパッケージが無いか、
バージョンが違って、起動できないみたいです。

あんまりにもめんどいので、GDC入れました。
こちらは、GCC4.1.2向け(ライブラリも含め)
のヤツが用意されているので、すんなり入りました。
 
 
 
Unknown (Unknown)
2011-04-16 09:41:45
おや、原因は別の所にあったか・・・
解決おめでと。 そしておつかれさま。
 
 
 
Unknown (ME By960)
2011-04-17 04:53:53
お気遣いありがとうございました。
途中、とてもイライラしてたので、ギスギスしてしましました。
どうもすみませんでした。

あと、D言語の標準ライブラリのSocketのクラスの使い方が、いまひとつ解らないですね。
スレッドもデタッチの仕方が分からないし、
結局C言語のsys以下のライブラリを使うしか・・・。
 
 
 
Unknown (Unknown)
2011-04-17 12:53:43
socketクラスは使ったこと無いけど・・・
まず、Socketクラス(またはTcpSocketかUdpSocket)のインスタンスを作って、
自分側から接続を確立するときは、connect()関数にInternetAddressのインスタンスを渡す、
相手側からの接続を受けるときは、accept()関数を呼び出す。
・・・で、いいのかな?

Dのライブラリでのスレッドは、強制的に止めることは出来ないので、
有限の時間で必ず止まる関数でスレッドを作るか、
スレッドを止める通知が出来る、Threadクラスを継承したクラスを作って使ってください。
 
 
 
Unknown (ME By960)
2011-04-17 17:01:43
おぉ・・・。なるほど・・・。
Socket関係はそんなに簡略化されていたんですね・・・。
従来のBSDソケットのつなぎ方とは大きく外れていて、
そこまで思いつきませんでした。

あと、スレッドに関しては、逆にめんどくさくなってますね。
ミューテックスの管理が楽な分、使う価値がありますが、
デタッチしないでどこまでスレッド吐き出せるんだろうか・・・。

あとで、実験して確かめてみます。
一応は、今のサバースペックでは、
C++だと1万3千いけました。
 
コメントを投稿する
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。