1 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 21:35:32 ] マルチスレッドプログラミングについて語るスレ。 その1 pc3.2ch.net/tech/kako/997/997345868.html その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/ その4 pc8.2ch.net/test/read.cgi/tech/1130984585/ その5 pc11.2ch.net/test/read.cgi/tech/1157814833/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他突起する事項】
101 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 08:59:33 ] 【OS】 Xp sp2 【言語】 VBA 【実行環境】 Q6600 VBAってマルチスレッドできないともできるとも明記されていないんです。 質問なんですが、VBAにかかわらずマルチスレッド化によって、『比較的発生しやすい障害』というのは何でしょうか? C等ならPUSH、POP等のメモリ操作がいちばん気をつかいそうなところですよね。 VBAでは、適所に Do Eventを2つ入れること(実験により1つではエラー起きやすい)、変数のグローバル宣言にきをつけること(2つのスレッドで同じ変数を呼ばない)ことくらいですかね。プロシージャーは同時に使っても今のところ問題ありません。 どうぞよろしくお願いします。
102 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:07:45 ] >【言語】 VBA >VBAにかかわらず どっちだよ
103 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:54:17 ] >マルチスレッド化によって、『比較的発生しやすい障害』 >101のような香具師が手を出してプロジェクトを台無しにする可能性が高まること。
104 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 10:55:09 ] 日本語でおk
105 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 11:36:22 ] > VBAってマルチスレッドできないともできるとも明記されていないんです。 M$に問い合わせろよ
106 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 12:51:30 ] 煽る人ばっかりで、本日はまともな人いないんですねー。>< 失礼しました!
107 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:41:29 ] >C等ならPUSH、POP等のメモリ操作がいちばん気をつかいそうなところですよね。 お前はいったい何を言っている?
108 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:47:28 ] >>101 お前の居場所はこっちだ pc11.2ch.net/test/read.cgi/tech/1178723829/
109 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:50:49 ] Cカップの子を触るのにおもいっきり触るのか それともソフトタッチでいくのかこれは結構気を使うって ことなんだな
110 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:58:17 ] PUSH,POPは気を使わない。それぞれ単純に排他制御するだけだ。 気を使うのは、例えば何かの目的のために一つの処理の中で pop,pushを続けて行おうとたらその間に別スレッドが実行されて 意図せず状態が変わってしまうようなことが発生すること。 排他制御していない箇所はどんなタイミングでどのスレッドが 実行されるかわからないことを肝に銘じておく必要がある。 『実験により1つではエラー起きやすい』 こんなこと言ってるようじゃ駄目だ。なぜ1つでエラーと なったのか論理的に分かるまで追え。まあDoEventを愛用 する奴にはマルチスレッドは剥いていない
111 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:15:46 ] VBAってCOMオブジェクト主体じゃないのか マルチスレッドの意味あんのかな
112 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 00:43:06 ] >101 VBA単独でスレッドを起こす手段がないからな。明記する必要もないだろ。 VBAだけじゃMutexとか同期用のオブジェクトをどうやって扱ったらいいものか、 スレッドを起こす手段がないので同期に関する記述もないからなぁ。 それにCOMだし意味がないかもな。
113 名前:デフォルトの名無しさん [2007/09/08(土) 01:29:00 ] 適当なスレが判断できないのでここで質問させて下さい。 msvcrt.dllやスタティックなVC6以降のmallocとfreeの動作についてですが、 _beginthreadexで作成した各スレッドで、あるスレッドがmallocしたメモリを 違うスレッドでfreeする事は合法でしょうか? 過去の自分の書いたコードで見つけてしまいました。 なんかやばそうな気はするんですが。
114 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 01:35:12 ] >>113 何を知りたいの?もうちょっと明確に話まとめろよ このインキン野郎が
115 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 01:51:13 ] >>113 スレッドが異なることは問題ない。 メモリ管理で問題になるのはモジュール(EXEやDLL)が異なる場合。 ただし、この場合でもすべてのモジュールのCランタイムを 動的リンク(msvcrXX.dllを使う)にしておけば、問題は発生しないはず。
116 名前:デフォルトの名無しさん [2007/09/08(土) 21:25:21 ] ありがとうございました。 一応きちんと動いてはいるみたいなので放置します。
117 名前:デフォルトの名無しさん mailto:sage [2007/09/08(土) 23:20:00 ] マルチスレっ
118 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:22:50 ] 合法か違法かで言えば合法だろうし、(問題でてないのに)直すってのもアレだけど、 行儀わるいよな。
119 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 03:47:08 ] >>118 アプリ全体のログを採る処理で、printfみたいな書式文字列を mallocやreallocでメモリに貯めていって、ある程度溜まった段階で 清書してファイルに吐き出して、使った分をfreeしてくという仕組みなんですが、 CriticalSectionの排他で順番だけ決めてるだけで、どのスレッドが メモリ管理をする、というのを決めてないんです。 まあ、最初と最後の破棄とかはメインスレッドがするんですが。 試しにスレッド間通信したらパフォーマンスが悪かったので こんな仕様にしたような記憶があります。 どうしたらいいでしょうかね。
120 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 11:39:09 ] きちんと管理できてるんなら問題ないでしょ。 C++ならstd::stringとか使ってくれた方が楽そうだけど
121 名前:デフォルトの名無しさん mailto:sage [2007/09/09(日) 15:29:38 ] マニアックにboost ropeで
122 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 07:56:13 ] boost? STLportじゃなくて?
123 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:00:27 ] XP/2000のスレッドで質問です。 親子関係にあるスレッドで、親をなるべくブロックさせずに、 毎秒数KB程度のデータを子に送信したいと考えています。 (子は1つで、子の応答はいくら遅れてもかまわない) クリティカルセクションでデータの排他をに試したら、 子供の処理が長引くだけ親がブロックされてしまうので、 別の方法を検討しています。 こういった場合、スレッド同士の同期オブジェクトを介さずに データをバッファに溜めておける名前付きパイプが良いかなと 思ったのですが、こういった用途に使えるでしょうか。
124 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:16:31 ] パイプの長さは必ず確保するという話ではなかった気がするなあ >クリティカルセクションでデータの排他をに試したら、 >子供の処理が長引くだけ親がブロックされてしまうので 通常、 バッファへの追加 バッファからの取り出し 以外は排他する必要はないと思うんだが、違うのか?
125 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:25:19 ] >>123 子スレッドが処理終わるまでロックさせっぱなしにしないで、 さっさと必要なデータをコピーしてクリティカルセクションから抜けたら?
126 名前:デフォルトの名無しさん mailto:sage [2007/09/16(日) 18:38:07 ] >>123 子供2つにすればいいだろボケシネカス
127 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 00:55:31 ] 10ヶ月かかるし。
128 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 20:48:36 ] 処理が終わるまで待ってたらスレッドの意味が無い。
129 名前:デフォルトの名無しさん [2007/09/19(水) 20:55:43 ] 【OS】 Debian Etch Linux kernel 2.6.18 【言語】 C pthread 【実行環境】 GNU gdb 6.4.90-debian gdbでのマルチスレッドのデバッグ中、任意のスレッドでステップ実行をしていると とつぜんカレントスレッドが切り替わり、 ステップ実行していたスレッドの実行位置が失われる現象に遭遇します。 デバッグ対象のプログラムは、動作確認がとれているオープンソースのプログラムです。 原因、回避法等ご存知のかた、ご教示いただけないでしょうか
130 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:12:16 ] gccスレにも行っとけ
131 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 22:58:11 ] >>129 250万でサポートしてやるけどどうよ?
132 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:06:29 ] 250万の内訳を教えてくダサイ
133 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:24:38 ] サンドバック料:200万 治療代:50万
134 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:28:49 ] >>132 年間保守契約費 200万 登録費 30万 事務手数料 20万 だが?
135 名前:デフォルトの名無しさん mailto:sage [2007/09/21(金) 23:17:41 ] ずいぶんと安いね
136 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 04:16:06 ] これからはsignalfdだな
137 名前:デフォルトの名無しさん mailto:sage [2007/09/24(月) 14:05:07 ] ロックしたら負けかな、と思ってる
138 名前:デフォルトの名無しさん [2007/09/24(月) 18:56:19 ] erlangマンセー
139 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 12:41:04 ] malloc(), free()ってスレッドセーフなんですか?
140 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 15:01:14 ] お前が使っているライブラリのマニュアル嫁
141 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 18:07:16 ] >>140 man malloc ってやってもスレッドセーフに関する記述がないんです...
142 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 18:41:26 ] 使っているOSの名前、バージョンを言わないのは初心者気取りか?
143 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 20:23:28 ] 対応してる。大丈夫だ。
144 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 22:14:38 ] >>143 安心しました。ありがとうございます。
145 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:24:04 ] 藻前詐欺にあい易いタイプだろ
146 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:39:03 ] ワロタ
147 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:06:02 ] 昔おれ衝動買いの時によくやった 店員に騙されるパターン 信じてたのに・・・・
148 名前:デフォルトの名無しさん [2007/09/30(日) 01:20:45 ] マルチスレッドでcoutを使うと表示がぐちょぐちょになって醜いです。 どうしたらいいでしょうか?
149 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:21:34 ] C++の仕様。 printf使いなさい。
150 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:27:17 ] すみませんprintfでも同じです
151 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:31:42 ] coutという一つの資源を複数のスレッドで取り合うからそうなる。 排他機構を使ってひとつのスレッドが使っているときに他のスレッドが使うことが無いようにしろ。
152 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 01:33:10 ] 出力スレッドでも作って、そいつに全部押しつけろ。
153 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:08:32 ] pthreadつかってマルチスレッドのプログラム作ってるんだけど. なぜか特定のタイミングでピタッと動かなくなる(デッドロックというのか?) それ以降プログラムがうんともすんともいわなくなる. デバッグする際にみんなどういうことやってる?gdbは使い物にならないし...ltraceも使えない... やっぱりソースコードを目で追っていってるわけ?
154 名前:148 [2007/09/30(日) 10:48:06 ] >>151-152 そんな事したらめんどくさくないですか? もうちょっと簡単な方法でお願いします
155 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:56:45 ] >>154 諦めろ
156 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 10:58:21 ] ソースを追うっていうか、どんなケースが起こりえて、 すべてのケースの組み合わせに対応できているか検証する。 大体は、止まりそうな場所はわかるから、そこを調べて、 次に、ブロックするかもしれない操作を洗い出して調べる。 止まる場所は突き止めたけど、どうして止まってしまうかわからない場合は、 状態をログに出したりするかな。 デッドロックより、最適化とかOoOでの実行順序の入れ替わりとか、 可視性が関わるバグの方が、調べるの大変だと思う。
157 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 11:12:22 ] coutやprintfがMT-safeでも、 出力が崩れるのはどうにもならないと思うので、 出力処理全体を1セットとして、ちゃんと排他しないと駄目だろう。
158 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 12:22:06 ] >>148 スレッドごとに出力先を分ける。
159 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:23:05 ] >>154 マルチスレッドプログラミングが「面倒くさい」ものでないならば そもそもこんなスレは存在して無いだろうよ。
160 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:40:06 ] >>154 ぐちょぐちょにならないっていうことの意味をもっとはっきりしないとだめだね 一番綺麗なのは、スレッドAの表示がすべて終わってからスレッドBの表示をすることだが、それならシングルスレッドにするのが一番簡単 つまりマルチスレッドやめれば解決
161 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:43:19 ] >>154 ドトネトのSystem.Consoleクラスならマルチスレッドセーフ。w
162 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 13:50:16 ] >>161 素朴な疑問なんだが、そのマルチスレッドセーフとは出力が混ざらないことまで保障してくれるのかね。 # だとしたら、逆に激しく不便なんだが。
163 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:03:37 ] >>158 のは、言われてみれば当たり前なんだが、 簡単だし、間違いないな。 変数/オブジェクトの持ち回りとかが、複雑になってたら、 スレッドローカルな変数を使えばいいし。
164 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:04:48 ] メソッド一発分が安全に動くだけだろ。
165 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:07:48 ] >>162 Console.WriteLineはアトミックに実行されて出力は混ざらないね。 ReadLineは1つのスレッドが入力実行中は他はブロックされるかな? 混ざらないとどの辺りが激しく不便なのでしょうか?
166 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:09:34 ] >>164 それ以外に何を求めると?
167 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:12:41 ] 行単位でも混ざって欲しくなかったら>164では不十分だろ。 行単位で適宜出力して欲しかったら混ざらなかったら不便だろ。
168 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:15:25 ] まず、「混ざる」の定義からはじめろ。 バイト単位なのか、 マルチバイト、ワイドキャラクタ等の文字単位なのか、 出力ストリームのメソッド単位なのか、 複数の出力ストリーム書き込みをまとめた、プログラムの中で定めたオレ単位なのか。
169 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:19:52 ] 初心者なオレのためにライブラリ、クラスのスレッドセーフの 定義を騙ってください。
170 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:28:21 ] >>166 何も求めてねーよ。 >>162 に答えただけだ。
171 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 14:34:16 ] >>170 メソッド一発分が安全に動くだけ以外のことをされると マルチスレッドでは激しく使い辛いですな。。
172 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 17:35:19 ] >マルチスレッドでは激しく使い辛いですな。 わかんねー奴に俺が翻訳してやる。 せっかく並列に動くのに余計なロックするなや 別に使い方が面倒になるわけじゃないよ いじょ
173 名前:148 [2007/09/30(日) 18:12:10 ] もういいです。わたしが馬鹿でした もうあきらめます。
174 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 18:20:52 ] なんだ、学習意欲のないやつだな
175 名前:148 [2007/09/30(日) 19:21:43 ] すみませんが、本当にわかる方、回答をお願いします。
176 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 19:28:32 ] 残念だったね。
177 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 19:36:20 ] 自分でマルチスレッド対応のストリームつくればいいじゃん
178 名前:148 mailto:sage [2007/09/30(日) 19:44:05 ] >>177 そんな事したらめんどくさくないですか? もうちょっと簡単な方法でお願いします
179 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 19:49:11 ] そもそもプログラミング自体めんどくさくないですか? ありあわせのフリーソフト探してくる方法が簡単だと思います
180 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:50:56 ] そもそも生きてるってめんどくさくないですか? 氏ねば簡単ですよ
181 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:56:18 ] >>180 どうやったら楽に死ねますか? 簡単そうな方法にはちょっと勇気が必要だし、そうでないのは簡単じゃないし
182 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:09:17 ] >>180 旅立ちパックの中に 連単はいってるからつかえ 以上
183 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 22:14:37 ] >181 死ねばすべてが楽になるんだ 楽したいなら、死ぬ努力ぐらいはしてもいいだろ 俺は死にたくないから、努力して生きるよ
184 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 23:11:03 ] >>178 ストリーム出力だけロックすれば済む話だろうが〜 どこが面倒なんじゃ〜?
185 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 01:35:10 ] マルチスレッドプログラミングは初心者には無理だよ 面倒=やり方がよくわからない という事であればこの先できるようになる見込みもなし 厳しいけどこれ現実なのよね
186 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 03:15:20 ] スレッガーさん!
187 名前:デフォルトの名無しさん [2007/10/03(水) 20:59:05 ] スレッドセーフじゃない場合はどうするつもりだったのかと・・・ スレッドセーフだったらどうしたかったのかと・・・ まぁいいや、どうせネタでしょ?
188 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 15:51:11 ] 次世代ゲーム機のCPUみたいにレジスタが山ほどあるCPUて コンテキストスイッチのオーバーヘッドも比例して増えてるんかな
189 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 16:02:08 ] 一部しか保存しなくてすむようにしてあんじゃね?IA64とかそうだべ。
190 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 17:01:20 ] 64bitのレジスタ32本あるのじゃまんぞくしねーのか?
191 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 19:38:15 ] 高速なキャッシュがたくさんあれば満足する
192 名前:デフォルトの名無しさん mailto:sage [2007/10/08(月) 20:11:01 ] IA64とかって確かコンテキストが2500バイトくらいいくんだよなw
193 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 21:36:08 ] おれはレジスタの数よりも、1次キャッシュに乗ってるメモリとの 演算やアクセス速度が、レジスタと同程度であれば良いと思ってる。 結局それが最強でしょ?
194 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:04:14 ] 命令セットの問題じゃね
195 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:47:19 ] だよね。 RISC系の、メモリアクセスは基本的にロード/ストアのみで 演算はレジスタに対してしか出来ない、ってアーキテクチャだと キャッシュの速度だけじゃなく、レジスタの数も欲しいはず。
196 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 22:58:57 ] そんなことできたら苦労は無いわ。 メインメモリにレジスタと同程度でアクセスできれば最強だな。
197 名前:デフォルトの名無しさん mailto:sage [2007/10/09(火) 23:43:09 ] >>196 補助記憶装置含めて光速の99%で処理できたらおk
198 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 00:46:35 ] 発想を逆にするんだ。 レジスタへのアクセスがメインメモリと同程度に遅(ry
199 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 13:37:41 ] じゃあ、みんながのんびりすればよくね?
200 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 18:07:14 ] 俺も思う。 CPUだけじゃなくて、日本人がもっとのんびりスベキナンダヨ
201 名前:デフォルトの名無しさん mailto:sage [2007/10/10(水) 21:55:40 ] 1ヶ月くらい休みクレ!