- 1 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 09:42:46.74 ]
- 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問。 質問者自身なんだか意味がよく分からない質問。 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められることがあります、ご了承下さい。 なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。 >>980を踏んだ人は新スレを建てて下さい。 >>980が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■前スレ ふらっとVisual C#,C♯,C#(初心者用) Part105 toro.2ch.net/test/read.cgi/tech/1371948073/ ■関連スレ C#, C♯, C#相談室 Part80 toro.2ch.net/test/read.cgi/tech/1373037260/ ■コード貼るなら↓使ってください ideone.com/
- 63 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:19:14.81 ]
- CPUの知識てw
- 64 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:19:16.44 ]
- >>50
されてません www.atmarkit.co.jp/ait/articles/1211/16/news093.html
- 65 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:19:34.58 ]
- CPUの知識ワロタ。どうせおまえもCPUの知識なんてカスほどしかねーだろ
- 66 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:22:16.45 ]
- 原理から理解する必要があるって言ってた奴とかぶるものがあるなw
- 67 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:25:45.64 ]
- 原理主義者だな
テログラマーか?
- 68 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:26:09.72 ]
- いくつ抽象化レイヤーをぶち抜いたらCPUの話になるんだよ
- 69 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:27:07.83 ]
- >>63
落ち着け。初心者だと言ってるようなものだぞ。 さて、この勘違いした初心者をスルーすべきか相手にすべきかだな。 おれはパス。
- 70 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:35:59.33 ]
- >>68
ほう。なぜこれが同期できてないかCPUレベルの話なしで初心者に説明してくれ。 これは典型的な初心者が書く馬鹿コードだから。既に稼動してるシステムで何度も見てきた。 Form1とかで bool lock = false int data = 0; 別スレッドで if(!lock){ lock = true; data処理 lock = false; }
- 71 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:36:16.73 ]
- 確かにスレッド案はまだ停止用フラグの実装とかやる事あるけど、
今回は独立性高いし勉強用としては良いと思う。
- 72 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:40:44.40 ]
- >>70
そもそも待機するコードになってないから
- 73 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:41:26.13 ]
- 釣りでなければ、どこにCPUレベルの話があるのかわからんが
もしかして、スレッドの話=CPUの話だとでも思ってるのか
- 74 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:44:41.35 ]
- >>72
正しいコードプリーズ。
- 75 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:46:23.41 ]
- volatileが必要とでも言いたいの?
そもそも説明を要求された理由が分からない
- 76 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:49:17.98 ]
- このスレのあまりのレベルの低さに同情する。 >>70
- 77 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:50:50.87 ]
- CPUの知識がどのレベルなのか分からないけど
レジスター、スタック、ヒープの構造と 各スレッドのコンテキストに割り当てられるリソースの 関係については知ってる必要があるし、それはCPUの 知識と言えるかもしれない
- 78 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:51:46.24 ]
- ロックしたいなら>>70なソースは書くわけないし。どう見ても>>70=>>76だし。自演までレベル低くて同情するよ
- 79 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:52:06.95 ]
- ロックってmonitor使うんじゃないの?騙された?
- 80 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:52:25.85 ]
- >>78
正しいコードプリーズ。
- 81 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:53:11.43 ]
- アセンブラのプログラマーの方ですか?
ここはC#スレですよ
- 82 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:55:25.45 ]
- 初心者ならそれこそBackgroundWorkerだろ
同期やロックはBackgroundWorkerイベントで 隠蔽されて安全に使える。
- 83 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:56:42.28 ]
- 精々lockやReaderWriterLockSlimで終わる話
なぜにCPUまで持ち出さないといけないのか
- 84 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 21:58:27.67 ]
- 初心者にはマルチスレッドは無理。
知ったかに説明しても逆ギレするだけ。
- 85 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:01:57.62 ]
- >>80
ほらよ ttp://codezine.jp/article/detail/139 の待機ハンドル if(!lock)なんてやっても一瞬で素通り。while(1)かましたらずっと判定処理になるだろ そんな糞コード書くなよ
- 86 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:04:47.30 ]
- >>85
while(1)にしても同期できないよ、素人。
- 87 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:07:32.39 ]
- while(true){
if(!lock){ lock = true; data処理 lock = false; } } これなら同期できると思ってる馬鹿がいる件について
- 88 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:09:01.24 ]
- >>86
だからそんなの使わないって書いてるだろ。日本語ぐらい読めるようになれ
- 89 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:09:51.13 ]
- >>70は会社員なのかなんなのかしらんが
既に稼動してるシステムでこのレベルのコードでマルチスレッド扱うプログラマがいるの? ちょっといくらなんでも信じられん
- 90 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:12:23.64 ]
- >>89
このスレで誰も答えを言えないのが答えさ。
- 91 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:19:01.08 ]
- >>79,81,82,85に答えがあるのにそれを全部無視する>>70w
- 92 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:19:19.66 ]
- >>85は知ってるが>>70のコード断片から導くのは困難だわ
CPUのキャッシュとメモリの同期の話とかかと思いきや何だよ考えて損したw
- 93 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:20:29.15 ]
- >>91
その中で一つでも同期できない理由を説明したものがあるのか。 ないじゃんwww
- 94 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:23:16.30 ]
- 素直にマルチスレッドなんにも分からないから教えてください、って言えよ
- 95 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:23:18.54 ]
- >>93
>>72
- 96 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:24:51.14 ]
- >>95
while(true){ if(!lock){ lock = true; data処理 lock = false; break; } } これで同期できる?
- 97 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:25:32.79 ]
- はい解散〜
解散解散〜
- 98 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:26:16.59 ]
- >>96
それで同期出来るなんて誰も言ってないしw もう引き下がってくれよw めんどくせーよー
- 99 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:27:25.68 ]
- >>96
できない>>85にあるだろ。こんなイメージ while(true) { manualEvent.WaitOne(); //処理 }
- 100 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:27:30.81 ]
- >>96
もちろんできない。 それ以前にその同期って言葉の使い方はちょとおかしい気が
- 101 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:28:55.09 ]
- >>96
無理。動いたり動かなかったりデバッグ困難な糞コード。
- 102 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:30:23.84 ]
- >>96 じゃ同期できない理由を説明しろ、糞ども。
- 103 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:33:37.85 ]
- してもいいけどそれがどうCPUと関係するのかも説明してくれよ
- 104 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:34:36.01 ]
- 頼む。説明してくれ。論理的な間違いが見つけられないw
- 105 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:37:30.81 ]
- >>104
ガチで言ってるの? 仮にlockが不揮発だとしても、「data処理」実行中の値は?
- 106 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:39:14.39 ]
- >>105
処理中にlockが変更されても問題ない(処理なら問題ない)
- 107 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:39:22.97 ]
- いやif(!lock){とlock = true;がアトミックじゃねえって話だろ
- 108 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:40:43.42 ]
- こう言った方がいいか。
シングルコアを前提としても、3行目が実行される直前に別のスレッドに 実行権が移ったらどうなる?
- 109 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:40:44.60 ]
- >>102
詳しそうだからスルーしといたんだけど、 lockが予約語だって知らないでしょw
- 110 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:41:14.81 ]
- if(!lock)
と lock = true の間に、他のスレッドがlockの値を書き換える可能性がある こんなチェックはなんのあてにもならない
- 111 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:43:25.96 ]
- でCPUの知識はいつ生きるの?
- 112 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:45:08.84 ]
- >>110
breakで飛ばす処理だから値書き換えられても問題ない
- 113 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:45:28.43 ]
- すくなくともC#でのプログラムに、概念的な知識以上のCPUの知識なんていらん
- 114 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:45:40.20 ]
- C#の1行とマシン語の1行が違うってこと?
- 115 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:50:23.25 ]
- 機械語1命令と実際のCPUの動作も違うな
OoO μOPとかややこしいのがあれこれ C#でスレッドやるなら出来る限り高いレベルの同期命令を使うのが吉
- 116 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:50:45.02 ]
- >>113
どんなコードを書こうとOSが提供する同期オブジェクトを使わないかぎり 同期できない理由を説明するにはCPUの話をするしかないんだけどね。 スレッド切り替えの粒度は機械語レベルだから。
- 117 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:53:22.06 ]
- CLRのスレッドをOSが管理しているわけがないだろ
midoriでも使ってんのか
- 118 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:54:25.98 ]
- 結局はmonitor使っておけばいいんだよね?
- 119 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:55:05.60 ]
- だからマルチスレッドは初心者には無理だと言ったんだ。
- 120 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:55:36.45 ]
- C#に(というか.NETに)スレッド同期のための仕組みが用意されているんだが?
スレッドについても、実際のコンテキストがどうであろうが、それは.NETによって隠蔽されているわけで OSよりさらに上位のレベルで抽象化されているわけだが
- 121 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:56:41.80 ]
- よし。これからはファイル読み込みにmonitorとかいうの使うぞw
マルチスレッドなんて簡単、簡単w
- 122 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:57:45.27 ]
- >>119
だな。>>70には無理
- 123 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:58:10.50 ]
- >>118
そのレベルだとMonitorも危険 BackgroundWorkerだけでいいよ
- 124 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 22:58:54.31 ]
- CPUの知識(笑)という言葉で想定されている知識の範囲もよく分からんけど、
どっちにしろそんなもの知らなきゃ非同期のコードが書けないわけでもないし、 知ってたからってより最適化されたコードが書けるってわけでも恐らくないよね。 それともパイプラインとかキャッシュとかHTとかマルチコアとか、CPUアーキテクチャーについて 深いレベルの知識があるのとないのとで何か違ってくることがあるのか?
- 125 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:01:21.20 ]
- >>123
俺は一番軽い同期オブジェクトを使いたい
- 126 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:01:57.24 ]
- マルチスレッドの話題は高度なので専用スレで、どうぞ。
- 127 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:03:39.37 ]
- 質問されてから同期オブジェクトの話が出てくるまで50レス近く消費するおまえらってw
初心者スレらしいなw
- 128 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:03:46.27 ]
- C#がどういうCLRになって、それがどういうアセンブラになるかまで理解できて
その上で、動かしてるOSのプログラム管理に関して精通していて 実行しているCPUにたいしてパイプラインやキャッシュについての知識があれば より最適化されたコードが書ける かもしれないな
- 129 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:04:16.91 ]
- >>125
これで結果が 0, 0 になるケースがあるのを理解できたら使っていいよ ideone.com/VPzJYN
- 130 名前:デフォルトの名無しさん [2013/09/07(土) 23:06:25.90 ]
- NANDやNORのTTLレベルの回路とか、ALUとかマイクロプログラミングとか、CPUのムダ知識は大学で習ったな
- 131 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:06:48.56 ]
- >>129
もう使いまくってるから今頃使ってもいいよとか言われても困ります
- 132 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:07:01.83 ]
- >>70
簡単じゃん。同期オブジェクト使ってないから。
- 133 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:07:23.27 ]
- >>126
いくらでも気づきにくい落とし穴が作れるという意味では高度だけど、 非同期の処理って言ったって大半は単純なもので、そこまで複雑でも高度でも ないと思うんだけどね。 基本的なアイデアはそう難しいものではないし、WPFみたいに覚えることが膨大に あるわけでもないし。
- 134 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:12:05.38 ]
- >>133
それはアプリによる。 どんどんForm開く仕様で共通データを処理しまくるとかは頭使う。 ロックするデータの範囲でパフォーマンスが全然変わってくるから。 下手すると簡単にデッドロック。しかも場所がどこだかログ追うだけでも地獄。
- 135 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:21:58.53 ]
- スレッドの使い方は2種類あって、
1.重たい処理をバックグラウンドで処理してユーザーインターフェイスを硬直させない 2.処理をCPUコアに分散して処理効率を上げる というのがあって、1は普通に使っていいと思うよ これは構造的にもそんなにややこしくならないし、 ややこしくなるようなら設計がおかしい
- 136 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:25:59.86 ]
- >>133
どう考えても「どんどんForm開く」というViewの仕様が 非同期処理の難易度を上げる(デッドロックを起こさないようコーディングすることを 困難にする)ことに貢献するとは思えないけどw
- 137 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:27:20.81 ]
- >1.重たい処理をバックグラウンドで処理してユーザーインターフェイスを硬直させない
ややこしいだろ。UIが操作できるんだぞ。処理中にあれこれ動かされたらたまらん。 結果、コントロール全部、Enabled(false)
- 138 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:28:18.26 ]
- >>137
再入の問題ならdoeventsでも同じだろ?
- 139 名前:デフォルトの名無しさん [2013/09/07(土) 23:30:11.62 ]
- WCF使って、重い処理を別プロセスに追いやるのが最強だろ
最後は別のコンピューターまで使えるし
- 140 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:30:37.91 ]
- もういいから
- 141 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:31:51.84 ]
- >>137
それはビューの状態管理の問題であって非同期処理に限った問題じゃないでしょ
- 142 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:33:48.07 ]
- 実例でいうと年金DBはデータがぐちゃぐちゃ。
- 143 名前:デフォルトの名無しさん mailto:sage [2013/09/07(土) 23:42:58.98 ]
- >>133
オラクルのバグに関していいたいが、契約に違反するので我慢することにしよう。
- 144 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 02:59:40.47 ]
- 必ずOSの同期を使わないいけないのは
スレッドスイッチングがC#コードやILレベルではなく、機械語レベルだからだな。 ロックは高級言語だけでは実装はできない。アセンブラ言語必須。
- 145 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 03:19:21.61 ]
- 「すべて」は機械語レベルで動いてるから機械語レベルじゃないとできない
だけどその機械語レベルの処理をC#なんかから呼び出すことができるからC#レベルからスイッチできるよ もうなんか書いてて頭いたくなって来た
- 146 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 03:34:12.11 ]
- C#は言語レベルでメモリモデルが規定されてる。
x86限定のメモリモデルでコーディングしてしてしまうと 移植性が無くなる。
- 147 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 03:48:16.81 ]
- C#で実装できないという話と、C#で機能を提供しているとでは意味違う。
C言語でもロックの実装は書けない。
- 148 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 03:55:47.44 ]
- >>147
違うようで同じだろ
- 149 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 03:59:41.03 ]
- >>147
おまえは「CでもC#でもそれはそのままじゃ動かない。機械語での実装が必要」って言ってるようなもんなんだよ 何が言いたいのかまったく意味不明
- 150 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 04:00:45.16 ]
- fenceもcasもILレベルであったような気がするな
C言語のような古い言語の場合はいまさら統一した メモリモデルを導入するのは難しいけど 新しい言語ははじめからマルチスレッド前提だから、 メモリモデルはしっかり規定されているよ
- 151 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 05:48:25.41 ]
- >>149
あんた実装の意味を勘違いしてるよ。
- 152 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 10:05:07.86 ]
- なにこのグダグダ感は
- 153 名前:デフォルトの名無しさん mailto:sage [2013/09/08(日) 12:26:47.88 ]
- 2chでクダ撒いてるような素人Lv2が何したり顔してんだって言う
|

|