1 名前:名無C mailto:sage [2019/03/07(木) 06:35:41.12 ID:6L3KEJfe0.net] !extend:checked:vvvvv:1000:512 次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為) 「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■関連スレ C#, C♯, C#相談室 Part93 mevius.5ch.net/test/read.cgi/tech/1492818720/ ■前スレ ふらっと C#,C♯,C#(初心者用) Part141 mevius.5ch.net/test/read.cgi/tech/1544839627/ ■コードを貼る場合は↓を使いましょう。 ideone.com/ https://dotnetfiddle.net/ ■情報源 https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index https://docs.microsoft.com/en-us/dotnet/standard/class-libraries referencesource.microsoft.com/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
619 名前:デフォルトの名無しさん mailto:sage [2019/04/29(月) 13:39:51.85 ID:NUp+Ex1Ma.net] 基本的に生成元になったスコープをDisposeするとスコープ管理下のオブジェクトがまとめて消える スコープはCreateScopeで再帰的に生成できる BuildServiceProviderで作ったプロバイダーはルートのスコープに生えてるプロバイダーと考えればいい アッドシングルトンで登録したやつは親子関係にある全てのスコープで1つしか作れずルートスコープと寿命が同期 アッドスコープドで登録したやつは各スコープ内で1つしか作れず作ったスコープと寿命が同期 アッドトランジエントで登録したやつはスコープ内で何個でも作れて作ったスコープと寿命が同期 ASP.NET Coreでは暗黙的に1つのリクエストに1つのスコープを割り当てる 訂正あったらヨロ
620 名前:デフォルトの名無しさん [2019/04/29(月) 13:43:03.33 ID:pjV/Nimc0.net] Scope = Asp.net用みたいな気になっていて全然知らなかったよ、ありがとう ただDIなしの場合にusing句で書けるようなのはDIありでも簡単にかけそうだけど、オブジェクトを扱う箇所が数箇所に分かれてるときは難しそう・・・・ ScopeをDIコンテナに突っ込んだら突っ込んだでまた問題が増えるのかな・・・・
621 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 20:23:22.69 ID:IHLGrYrL0.net] System.Globalization.JapaneseCalendarでeraを取得しているんだけど Rが入ってこない・・・ Windows10でWindowsUpdateも最新なんだけど、何で入ってこないんでしょう
622 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 20:28:08.43 ID:w+F7NKD3a.net] >>613 https://docs.microsoft.com/en-us/windows/uwp/design/globalizing/japanese-era-change > To test that your application works with the new era, you must advance your computer's clock to May 1, 2019 or later. PCの時刻設定を2019/05/01以降にする必要があるらしい
623 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 20:38:50.44 ID:LbZ9KfXX0.net] まずまだアップデートはオプション段階だが、KB4493443入れてる? 正式なWindowsアップデートは5月以降だよ
624 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 20:45:03.73 ID:YvhWBPAF0.net] KB4493443って、Windows8.1用だったような。 ちなみに、Windows10, version1809用は「近日公開予定」だそうで。 https://support.microsoft.com/ja-jp/help/4469068/summary-of-new-japanese-era-updates-kb4469068
625 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 21:35:51.80 ID:u6t/T7mma.net] もう元号とかやめて欲しいよねほんとw いい加減役所も西暦に一本化しろよ
626 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 21:36:53.61 ID:TyGEr2d8a.net] 統一したら雑務が減っちゃうだろ
627 名前:デフォルトの名無しさん mailto:sage [2019/04/30(火) 22:02:27.50 ID:LbZ9KfXX0.net] >>616 訂正ありがと 手元にあるのが8.1で全部おんなじかと
628 名前:デフォルトの名無しさん mailto:sage [2019/05/01(水) 06:30:43.85 ID:+0nnIASf0.net] 皆さんレスどうもです まだ対応待ちってことですね・・・ とりあえずいまはテスト用にレジストリいじれるしかなさそうですね
629 名前:デフォルトの名無しさん [2019/05/01(水) 14:39:10.04 ID:NTU1YIA40.net] インデクサーってpublic T this[int I]{}みたいに定義するらしいけどさあ ここに出てくるthisの部分って、this以外も入りうる余地ってあるの?
630 名前:デフォルトの名無しさん mailto:sage [2019/05/01(水) 14:49:13.86 ID:lxO04VNX0.net] >>621 無いよ this以外にするとインデックス付きプロパティって意味になると思うけど、c#には無い
631 名前:デフォルトの名無しさん mailto:sage [2019/05/01(水) 14:51:52.86 ID:U25K78xGa.net] >>621 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#indexers > indexer_declarator > : type 'this' '[' formal_parameter_list ']' > | type interface_type '.' 'this' '[' formal_parameter_list ']' > ; 入るのはthisだけで、this以外が入る余地はない
632 名前:デフォルトの名無しさん [2019/05/01(水) 15:04:58.50 ID:NTU1YIA40.net] ありがとう 無いものについてパッとわかるとか驚くぜ
633 名前:デフォルトの名無しさん mailto:sage [2019/05/02(木) 05:11:25.37 ID:fWQ7EMkU0.net] メモ https://www.enterprisedb.com/download-postgresql-binaries https://www.devart.com/odbc/postgresql/ https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&rel=16 https://www.nuget.org/packages/MySql.Data/ https://www.nuget.org/packages/Npgsql/ https://www.nuget.org/packages/dotConnect.Express.for.PostgreSQL/ https://www.nuget.org/packages/Microsoft.Office.Interop.Excel/ https://www.pgadmin.org/download/pgadmin-4-windows/ https://dev.mysql.com/downloads/
634 名前:デフォルトの名無しさん mailto:sage [2019/05/02(木) 06:26:48.77 ID:qeQLZJi00.net] そういうのはQiitaでやれ(Qiita警察激怒)
635 名前:デフォルトの名無しさん mailto:sage [2019/05/02(木) 12:04:50.67 ID:ir+Ne9RR0.net] メモ系ツールなんて山ほどあるのにわざわざこんなところに書くのか 俺こんなの調べてんだぜすごいだろ?みたいな承認欲求なのかね?
636 名前:デフォルトの名無しさん mailto:sage [2019/05/02(木) 19:31:55.56 ID:Plm8DXbx0.net] 初心者ですが、乱数系列の初期化(Randomクラスのオブジェクトの生成)は どこに書くのが正解なんでしょうか? 関数の中に書くと、関数が呼び出されるたびに初期化されるんじゃ?と思えるのでちょっと拙い 関数の外側にプログラムの初めの辺に書いておけばいいのかなあ?とも思うのですが、それもカッコ悪い
637 名前:デフォルトの名無しさん mailto:sage [2019/05/02(木) 19:36:11.39 ID:rtZHUO2Da.net] >>628 依存性として注入するのが定石
638 名前:デフォルトの名無しさん mailto:sage [2019/05/02(木) 20:19:04.27 ID:Plm8DXbx0.net] 依存性 注入で検索したらいろいろ出てきたので調べてみます
639 名前:デフォルトの名無しさん [2019/05/03(金) 03:27:08.36 ID:eVcW5sZJ0.net] >>628 最近のは年月日時分秒を整数にして種にしてるっぽいから、 毎回初期化の方がランダム性が高まるんじゃないかと思ってる。
640 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 03:31:56.40 ID:t597qxt20.net] >>628 仕様次第 乱数の仕様を設計書に明記する必要がある
641 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 12:41:41.06 ID:Xwdpydd1a.net] >>628 訳分からん解答が続いてるけど、素直に インスタンス固有である必要があるならコンストラクタに staticでよいなら静的コンストラクタに 書けばいいだけ。かっこ悪いとか、くだらないことに悩むのは時間の無駄。 この場合は不要だと思うけど、静的コンストラクタが実行されるのはそのクラスの 静的メンバーに初めてアクセスされたタイミングだと思ったので、その点は場合によっては注意
642 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 12:51:40.57 ID:JARezKaea.net] >>633 嘘を教えるな そんな馬鹿な使い方をしたらテストできなくなるだろ
643 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 13:16:48.56 ID:JqDPcuspM.net] private staticなら単体テストには支障ないだろ 厳密な再現性を求めるなら本来はシードを固定するべきだが
644 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 13:23:25.74 ID:Xwdpydd1a.net] どっからテストとか出てくるんだw 意味が分からん
645 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 13:28:31.30 ID:5Dkgrzu1M.net] >>633 そもそも因果関係が逆だよな キモメンが書いたコードがダサい
646 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 13:39:56.17 ID:ffSbfxo8M.net] >>636 staticだとコンストラクタで実装を差し替えられないから単体テストの邪魔になりやすいというのは一般論としてはある Randomを差し替える必要があるケースは極めて稀だが、上で述べたように厳密な再現性が求められるケースならありえなくもない
647 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 13:45:36.92 ID:JARezKaea.net] >>635 直近のN回が特定の数列の場合のテストとかしにくいだろちったあかんがえろ >>636 テストしねーのかてめー?終わっとるな
648 名前:デフォルトの名無しさん [2019/05/03(金) 13:57:48.60 ID:Zy40eisO0.net] >>639 横からすまんが、そのテストしにくい例ってのをコードで見せてくれんかな 学習のためにどうか頼むわ
649 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:05:21.52 ID:N/aYDMHoM.net] >>640 例えばガチャを作ってるとして、0-999の乱数で0-9が出たらSSRを排出する仕様なら、 0と9と10くらいを決め打ちでテストしたくなるだろ? まあそのために乱数生成器をモックしなきゃいけないような設計には再考の余地があると思うが、状況としては普通にありえるだろう
650 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:07:16.80 ID:roEz64M2M.net] あなるあなる肛門肛門
651 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:07:36.88 ID:roEz64M2M.net] すまん誤爆でした!!!
652 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:09:46.15 ID:Xwdpydd1a.net] だから質問者はそんなこと聞いてないって... どんだけ独りよがりの妄想展開するんだよ
653 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:11:43.11 ID:roEz64M2M.net] >>644 うるせーばか子ね
654 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:16:40.44 ID:JARezKaea.net] 現在時刻とか乱数みたいな制御しにくい値はインジェクションする これ常識な 勉強になったねきみたち
655 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 14:47:40.00 ID:3MJf1YjB0.net] >>644 カッコイイか悪いかだから って問題があってカコワルイ ってつければ質問者の望む回答
656 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 15:12:05.72 ID:uS7vqCXY0.net] >>639 本末転倒だろう。 作るべき物の要件に合わせて乱数生成の挙動を定義して設計するのが優先すべき事項で、その実装をテストするためのコードは必要に応じて用意すればいいだろう。
657 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 15:31:58.12 ID:JARezKaea.net] >>648 それはアマチュアの考え方
658 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 15:33:51.16 ID:wCLW0/2P0.net] >>649 スレタイ読め
659 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 15:38:42.54 ID:q0Uiy+aiA.net] どーでもええわ
660 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 15:58:52.41 ID:Ue5NRrHW0.net] 教えてください。 以下のコードで、x の定義は問題ないのに y の定義だけコンパイルエラーになってしまいます。 == const Exception e = null; const bool x = e == null; // エラーなし、true が設定される。 const Type t = null; const bool y = t == null; // CS0133 y' に割り当てられた式は定数でなければなりません。 == 何が原因でこのような違いがでるのでしょうか。 また、y を定数のままエラーが出ないように修正することは可能でしょうか。 よろしくお願いいたします。
661 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 16:01:49.32 ID:3MJf1YjB0.net] >>652 結果によってtrueやfalseになるようなんは定数と呼ばん
662 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 17:46:27.38 ID:Xwdpydd1a.net] >>652 例外はTypeで==演算子が再定義されてるからみたいなので、 const bool y = t == (object)null; 一応これで文句言われないみたい
663 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 17:53:37.68 ID:Xwdpydd1a.net] あ、なんか例外とか意味不明なこと書いてるけど突っ込まないでねw
664 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 18:53:11.77 ID:78NC+NUs0.net] >>654 え? それ通るの? 怖い
665 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 19:21:25.35 ID:Xwdpydd1a.net] 言語仕様の「定数式」の項を見れば別に不思議はないんだけど、 他人の書いたコードでこういう式を見たら一瞬「何の意図でこんな式を書いてるんだ?」 と思っちゃうね。
666 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 20:24:56.25 ID:Ue5NRrHW0.net] >>653 レスありがとうございます。 定数のまま、というのは const を付けたまま、という意味のつもりだったのですが、 表現が不適切だったかもしれません。失礼いたしました。 >>654 ありがとうございます!うまくいきました。 ちなみにいろいろ試してみると、 string は == が定義されているもののエラーが出ないようです。 さすがに string は特別ということのようですね。 (ただ、typeof(string).IsPrimitive は false にだったりして いまいちしっくりきませんが。。。) == const string s = null; const bool z = s == null; // エラーなし、true が設定される。 == 何にせよ、問題はすっきり解消いたしました。 適切なアドバイスどうもありがとうございました。
667 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 20:25:45.58 ID:Ue5NRrHW0.net] >>657 実際に const を使いたかったわけではなく、 問題の切り分けを行った結果として >>652 のように質問させていただいたのですが、 言われてみれば確かに何がしたいのかわからない・・・。 もう少し元の問題に近いコードを提示するなら、以下のような感じです。 == const Type t = null; if (t == null) Console.WriteLine("t is null."); else Console.WriteLine("t is not null."); // 警告なし const Exception e = null; if (e == null) Console.WriteLine("e is null."); else Console.WriteLine("e is not null."); // CS0162 到達できないコードが検出されました ==
668 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 20:54:20.72 ID:mscz+0vpa.net] >>659 いやいやいや、俺はおたくにケチつけたわけじゃないよw const bool y = t == (object)null; こういうのはぱっと見て意図が分からないと言っただけ。 むしろ「マジックナンバー」を避けるのは良い習慣ですよ
669 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 20:57:46.12 ID:mscz+0vpa.net] >>658 >string は == が定義されているもののエラーが出ないようです。 上にも書いたけど、その辺のモヤモヤはC#の言語仕様の「定数式」の箇所を見れば解消するよ。 VSのインストールフォルダに入ってる
670 名前:デフォルトの名無しさん mailto:sage [2
] [ここ壊れてます]
671 名前:019/05/03(金) 21:13:39.41 ID:rGk2iQn5a.net mailto: ひょっとして、ES6あたりの感覚で代入onlyの変数を宣言したくてconstキーワードを使おうとしてるのかなと思ってみたり readonlyなローカル変数みたいな構文ってC#にはまだないんだよね [] [ここ壊れてます]
672 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 22:02:39.62 ID:Ue5NRrHW0.net] >>660 > const bool y = t == (object)null; > こういうのはぱっと見て意図が分からない そうですねw 式の意味を考えるなら t == (object)null は ReferenceEquals(t, null) と書くのがわかりやすいんでしょうけど const うんぬんの話の中でこれはダメですし。 ちなみに今ふと思いついて試してみたんですが、 t is null も == の定義には依存しないものの定数扱いにはならないようです。 >>661 ありがとうございます。 言われてみると、そもそも C# と CLR の役割自体が正確に区別できていないような 気がしてきたので、これを機会に勉強してみようと思います。
673 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 22:03:15.73 ID:Ue5NRrHW0.net] >>662 質問させていただいたのは、 >>659 のコードみたいに CS0162 の警告が出てほしいのに 出てくれない場面があったからです。 でもたしかに readonly なローカル変数はあってもいいですよね。 あと、引数のみに依存して副作用もないメソッドについて ↓みたいな書き方が許されたらいいのに〜とか妄想しましたw == static class MathEx { public const double Square(double x) => x * x; } static class MyConstants { public const double SquarePI = MathEx.(Math.PI); } ==
674 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 22:05:09.07 ID:Ue5NRrHW0.net] 何度もすみません。。。上の妄想コードは間違いです。 正しくはこちら。 == static class MathEx { public const double Square(double x) => x * x; } static class MyConstants { public const double SquarePI = MathEx.Square(Math.PI); } ==
675 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 22:55:31.79 ID:1vSUmwo4M.net] 実質的に定数ならJITコンパイル時に定数に置き換わるからそんなものは要らん
676 名前:デフォルトの名無しさん mailto:sage [2019/05/03(金) 23:53:26.41 ID:BZD1sthA0.net] decimalの定数は内部的にアレだけどな
677 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 07:03:09.32 ID:Y3LpLEUoM.net] >>667 詳しく
678 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 13:03:57.01 ID:3sktWiiHa.net] >>668 横からだけど https://ufcpp.net/blog/2016/12/tipsprimitives/ のことだと思う
679 名前:デフォルトの名無しさん [2019/05/04(土) 14:32:15.09 ID:IHSUUilV0.net] List.Addって、複数のスレッドから同時に呼び出したらデータが壊れる可能性ってあるの?
680 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 15:00:48.03 ID:NSx1pb1m0.net] >>670 スレッドセーフじゃないからlock制御を自前で持つか、System.Collections.Concurrentのコレクション使うべき
681 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 15:23:49.46 ID:H40F3Pfj0.net] Queueの出し入れもlock必要だし、マルチスレッドはめんどいよな。 なんでConcurrentDictionaryはあるのにListは無いのか
682 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 15:37:29.51 ID:uz0VN5nda.net] >>672 使い道がない
683 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 15:38:02.55 ID:vy21Hr2ZM.net] 個人的にはスレッド自体に特定のスレッドからのデータを受け取る処理がある方が好き
684 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 15:57:05.65 ID:qIB0qWQDM.net] 別々のスレッドから生成された値を集めたいなら、 各スレッドで別のバッファ(List)に値を書き込んでから最後に単一スレッドでマージするのが定番
685 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 17:20:59.03 ID:pMssk1qR0.net] スレッドセーフって実はどういう動作するのかよく知らないぜ
686 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 17:27:01.27 ID:0zm1CIpf0.net] >>676 わかる エラーがでなかったらそれがスレッドセーフ!!
687 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 20:18:11.93 ID:pMssk1qR0.net] APIのマニュアルにおいて「スレッドセーフ」という言葉が用いられる場合、たいていは「複数のスレッドからアクセスされても例外を出さない、プログラムがクラッシュしない」というような意味です。 しかしプログラムの目的によっては、例外が出ないだけでは不適切です。 例えば対象が、100個のデータを管理する変数だとします。 その100個のデータに対して、1つ目から順に処理するスレッドと、50個目から変更するスレッドが同時に動いたらどうなるでしょうか? 結果は不定です。 この例では、排他処理 (C#なら lock ステートメントなど) と呼ばれる処置が必要になります。 ってググって出たサイトで拾った
688 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 20:25:20.65 ID:pMssk1qR0.net] つまり for(int i=0;i<lst.count;i++) { unk un=lst[i]; 略 } みたいなプログラムを組んだとき どっかでいきなり要素をゼロにされて死ぬってことは スレッドセーフだろうがどうだろうが可能性はあるってことだよね ってことを考えるとスレッドセーフである意味ってあんまりなくて 排他処理は絶対実装しないと駄目だよね?ってこと? 誰か違うと言ってくれ
689 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 20:59:32.71 ID:Ui9BQ5TxM.net] スレッドセーフはメソッド内などで一貫性を保てる作り 排他制御が必要な場面でやってないなど作り手のロジックミスには対応出来るわけがない
690 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 21:06:21.08 ID:Ui9BQ5TxM.net] スレッドセーフである意味 あるオブジェクトがプロパティAを持っててメソッド内で b=aaa(A)+bbb(A); を計算しようとしても複数のスレッドからアクセスされることを考慮されていなければ 最初のAと次のAが違う場合があり計算結果が期待したものにならないかもしれない スレッドセーフはこういう場合でもちゃんと計算される仕組みを持つ
691 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 21:07:23.59 ID:3sktWiiHa.net] >>679 その処理は要素数チェックと要素アクセスが分かれているから、間に他スレッドからの処理が割り込み得る System.Collections.Concurrent系のコレクションは、 例えば「要素があるなら取得」のようなまとまった処理がatomicになっているので、他スレッドからの割り込まれない(=スレッドセーフ) どっかのスレッドで詰めて、別のスレッドでループ処理、がやりたいのならBlockingCollectionが楽
692 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 21:27:48.58 ID:qIB0qWQDM.net] >>679 厳密に他のスレッドとの同期を取らなきゃいけないなら>>682 の言うようにBlockingCollection使うか毎回ロックだろうし、 ループ中は他のスレッドによるlstの変更を反映しなくていいならループに入る直前だけロックしてコピーしておけば済む ケースバイケースだよ 一つ一般的なアドバイスをしておくと、並列処理のコツはデリケートな前提をなるべく設けずに極力ロバストな設計をすることだ 要件が許す限りにおいて、少々処理の順番が入れ替わったり処理間の同期が取れてなかったりしても問題にならないつくりにするのが理想
693 名前:デフォルトの名無しさん [2019/05/04(土) 22:09:10.98 ID:56LrGuhB0.net] 非同期処理は複数のスレッドが同じデータを弄ろうとすることによる不整合は起きないけど コールスタックは複数になるから 同じデータに触ると訳ワカメになる事があった
694 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 23:16:04.81 ID:pMssk1qR0.net] (||゚Д゚)ヒィィィ!(゚Д゚||) じゃあ>>679 みてーな処理を書いたら スレッドセーフなんて関係なく バグるんだね こぇえええええ じゃなくて終わったわ 今まで組んだもんでテキトーにやった箇所全部終わってる気がする
695 名前:デフォルトの名無しさん mailto:sage [2019/05/04(土) 23:28:33.99 ID:J15hVQV0a.net] まあ複数スレッドで同時並行処理するときにはそのへん慎重を期さないと 再現困難なバグを埋め込んじゃうからねえ 同時に読み書きする可能性のある変数を安易に書き換え/差し替えしちゃダメ
696 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 05:07:07.08 ID:tvdtPjB+0.net] マルチスレッドの恐ろしさは、たまにしかバグらない事。 ほとんどは正常に動くから、質が悪い。 必ず、バグらないだろ それで喧嘩になる事も多い。 マルチスレッドは、ベテランでもバグるからやめろと言っても、 ほら、バグらないでしょ? と、突っかかってくる その時には、バグらないと言うと、 千回実行しても、バグらないでしょ? と、突っかかってくる。 でも、その時にはバグらない バグる立証をするのが難しい だから、Ruby をやった人は、関数型言語のElixir をやる。 他の言語の人は、何を言っても、そのテスト回数でバグらないと言ってくるから、質が悪い 1万回実行しても、10万回実行しても、その時にはバグらないものなんだよ。 何回バグらないで実行すれば、正しいと認めるのか、と問われても困る
697 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 06:10:17.07 ID:BzgWdCy40.net] アクマノショウメイ
698 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 08:46:40.02 ID:TKrOuc6uM.net] >>687 喧嘩になるのはマルチスレッドのバグのせいではなくお前の頭がバグってるから
699 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 08:57:36.80 ID:Vqy33e5r0.net] エビデンスとれてりゃ突きつけるだけなのに
700 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:34:54.98 ID:RPhfdkos0.net] >>687 マルチスレッドはバグるからやめろってなるのでなく、バグが無いように作れよ。 あと、お前の意見を相手が聞き入れず喧嘩になるのは、お前がいつもバカなことを言うから相手は当然受け入れる気にならず、お前にはその自覚がなくて「何でアイツは僕の言うことを理解してかれないんだウワアーーー」ってなってるからだぞ。
701 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:45:50.32 ID:bYgaGqRgM.net] >>687 なんでバグが起こってるのか原因特定出来てなくてワロタ
702 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 10:48:34.16 ID:uudMW5nw0.net] スレッドセーフは単発のメソッドが競合しないだけで 一連の処理についての動作保証をするものではないと マルチスレッドはやらなくていいならそれに越したことはないけど 絶対に駄目というわけではなく 排他処理を組まないことが害悪
703 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:21:06.67 ID:IBoHsNppa.net] 排他制御をしなくても安全に並列処理できるように設計することが大事 まずはロック、クリティカルセクション、ミューテックス、セマフォ、といった待ち時間を発生させるタイプの機能を使ったら負け、というルールで設計に挑戦してみるといい 大半の並列処理でそんなものは必要ないこと、それらを使わないほうが圧倒的に設計とプログラムが綺麗になることを体験するべき
704 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 11:29:03.77 ID:Q2loWuJOM.net] シネ
705 名前:デフォルトの名無しさん [2019/05/05(日) 12:22:10.03 ID:6g/cxz/+M.net] ぱられるふぉーってのを使えば良いんじゃね? 知らんけど
706 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 12:32:51.31 ID:uudMW5nw0.net] >>694 うーん、でも>>679 みたいなこと やった時点で終わりってまともじゃねぇよ コードで一瞬でもすきを見せたら終了みたいになっちゃうじゃん お前の理想はなんかあるんだろうけど 他人が叫ぶスレッドセーフに頼っちゃ駄目だよ アプリの仕様として排他処理を盛り込むべき
707 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 13:01:26.26 ID:EeTrV1LT0.net] >>697 だからさ、>>679 みたいなforループ自体をスレッドセーフにする一番簡易な表記方法がlockなんだよ これ以上簡単に書くことはライブラリをどんだけ上手く作っても無理
708 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 13:15:03.75 ID:l159r3xkM.net] >>698 それって記述が簡単ってだけでしょ? ロック中にアクセスしたらどういう動作するの? 次回に回すの? 待機して待つの? そういうのってスレッド毎にステータスを持たせて マトリックスで管理しないと制御できてると俺は認めない ジジイだから
709 名前:デフォルトの名無しさん [2019/05/05(日) 13:34:55.82 ID:1Pm7tIcB0.net] VisualBasic大先生を怒らせてしまったようだな
710 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 13:41:27.68 ID:IBoHsNppa.net] >>698 だからさ そんな不安定なロジックを書かなくても良いようにちゃんと設計するのが並列処理の王道なんだよ lockブロックは最初の一回を書くときは楽かもしれんがだんだん難しくなるぞ そのコレクションを使う全てのプログラマが並列性を意識して正確に排他制御をコーディングしなければならない これは実用的なシステムの規模になるとかなり大きな負担になる
711 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 14:02:39.93 ID:IBoHsNppa.net] そもそもロックって論外なんだわ 世の中の並列処理の目的ってのはほぼ2種類に分類されるんだよ @インフラストラクチャ処理中にCPUを待たせたくない A消費コア数を増やして暇なCPUを働かせたい よーするにCPUを無駄にしたくないわけ でもロックしちゃうと問答無用でCPUが何もせずに止まっちゃう ロックすると並列処理をする目的そのものに反してしまう なのでロックは基本使わず最後の手段ってわけ この辺りは(やや古い本だが)Microsoft Pressのプログラミング.NET Franework第4版やEffectiveシリーズでも解説されてることだね どちらも良書なので脱初心者を目指しているだろう君達は是非とも読むべきだ
712 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 14:08:00.64 ID:kZz1htUnM.net] その通り 極端な話、並列処理なんてそれぞれ別のサーバーで実行させりゃいいんだよ それがレイテンシやコストなどの問題で無理なら代わりにプロセスを分ければいい そもダメならリクエストやワーカー単位でスレッドを分け、といった具合に、共有するリソースを最小限にすることを優先する
713 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 17:40:50.25 ID:Q2loWuJOM.net] ジジイだから能力低いだけだろ
714 名前:デフォルトの名無しさん [2019/05/05(日) 18:00:00.04 ID:1Pm7tIcB0.net] 非同期処理全盛の時代にこれじゃ、世の中やばいコード(or非同期処理のつもりが同期処理されてるコード)だらけだろうな Qiitaとか見ててもやばい奴だらけだ
715 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:04:40.39 ID:IBoHsNppa.net] >>705 今時lockだもんな、笑えない深刻さ お前のコード、めちゃくちゃブロックされてんだけど、って同僚の誰かが教えてやればいいのに見て見ぬ振りは可哀想だ
716 名前:デフォルトの名無しさん [2019/05/05(日) 18:09:44.07 ID:1Pm7tIcB0.net] そもそも、世のサンプルプログラムの多くが欠陥品なのが諸悪の根幹なのかもな 劣化コピーしちゃうQiita屋とかコピペプログラマが全部危険なコードを書いてしまう
717 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:19:48.84 ID:Q2loWuJOM.net] 一番パフォーマンスの良いMutexを使ってる人がどれだけいるやら
718 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:23:53.97 ID:IBoHsNppa.net] >>708 よくねえよw OSリソース消費する処理に速度を期待するな
719 名前:デフォルトの名無しさん mailto:sage [2019/05/05(日) 18:27:02.59 ID:Q2loWuJOM.net] 他人に迷惑をかける基地外はシネ