- 1 名前:デフォルトの名無しさん mailto:sage [2020/07/13(月) 13:51:48.09 ID:WBkWHxcT.net]
- エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1556142878/
- 699 名前:636 mailto:sage [2021/04/26(月) 02:36:05.57 ID:0cli3R6k.net]
- 色々と試行錯誤してたら
>>651のコードのこの部分を for(int x = 0; x < ImageWidth; ++x){ このように書き換えたら普通に速くなったw for(int x = 0; x < ImageWidth / 1.0f; ++x){ なんか最適化が効いたり効かなかったりみたいな差に感じてしまう。 そういう原因なのかな?
- 700 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:37:06.08 ID:u7NjNSbC.net]
- >>674
2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、 それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も 有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも 言えないけど。
- 701 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:39:54.17 ID:u7NjNSbC.net]
- >>677
使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと Release版にして最適化は有効にしてる? DebugPrintを使っているなら最適化はOFFになってるのでは?
- 702 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:43:34.12 ID:0cli3R6k.net]
- >>678
でも>>677の修正で速度が劇的に変化するのはなんでなんだろう? >>679 Releaseで調べてるよ。OutputDebugStringはReleaseモードでも使えるので。
- 703 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:46:30.17 ID:0cli3R6k.net]
- >>677の修正をしたあと、>>636のダミーコードを
追加したらなんと今度は遅くなったwwなんでだ?w >>636のダミーコードだけ追加したら速くなって ダミーコードを削除すると遅くなる その遅くなった状態で>>677の修正をすると速くなる その速くなった状態で>>636のダミーコードを入れると 今度は遅くなるww
- 704 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 02:43:12.80 ID:qV+SOSDm.net]
- 状況から察するに、おそらく君が見ている部分じゃない
どこかに根本的な問題がある、という気がする なんとなくだけど、バッファオーバラン系のような気がする
- 705 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 05:25:14.56 ID:Vf/GSwOl.net]
- >>682
どこかに問題がありそうですよね。 バッファオーバラン系は問題あっても動いてしまう事があるから怖いですね。 地道に調べて行くことにします。
- 706 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 11:47:32.64 ID:V9b4VlmB.net]
- それより、12秒間も大量のメモリーを使う状態でCPUがフル
- 707 名前:パワー状態になっている
とすれば、フル・キャッシュ汚染してる可能性がある。 フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために 速度が不安定になるから、説明可能。 [] - [ここ壊れてます]
- 708 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 12:52:21.01 ID:cPrICHbO.net]
- Meltdowm や Spector 対策のパッチの影響とか?
特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。
- 709 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 02:54:54.42 ID:XgRH6ChF.net]
- >>684-685
みなさんありがとうございます。 色々な問題が考えられそうですね。参考になります。 もう少しコード弄りながら挙動を調べて行きたいと思います。
- 710 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 04:32:07.96 ID:v8E9sca8.net]
- >>686
なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、 本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。 しょうがないけれども。 それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。 完全にメモリーを逆方向に読んだりすると、低速化の原因になる。 この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が 速くなる。DDR-MemoryはBurst転送が基本なので。 キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから 外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは 速度低下の原因になる可能性が出てくる。絶対ではないが。
- 711 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 10:42:03.12 ID:XgRH6ChF.net]
- >>687
そういう問題もあるんですね。とても詳しくて勉強になります。 ありがとうございます!
- 712 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 11:32:29.48 ID:oswWyFbg.net]
- >>687
読み書き方向が逆になるなら、読む方を順方向にすると良さそうだと思うけどどう思う?
- 713 名前:デフォルトの名無しさん [2021/04/28(水) 13:14:16.90 ID:WdoV9Bq9.net]
- >>689
コンパイラのくせに生意気だぞ
- 714 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 13:16:59.82 ID:jQpDsyge.net]
- >>689
実は昨日の夜から、俺もそう思ってた。 今は、 読む方が逆方向で、書く方が順方向になってしまっているが 読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの 仕組みから行って速くなる可能性が高い。
- 715 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 14:04:09.00 ID:4fcF+gv5.net]
- Windows の bitmap で ファイル中の配置や CreateDIBSection() で戻ってくるメモリの配置だな
デフォで bottom - up の方向 カメラのフレームとかは top - down な方向 ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして
- 716 名前:デフォルトの名無しさん [2021/04/28(水) 15:30:36.23 ID:WdoV9Bq9.net]
- 走査線と描画が重なったらチラツキが激しくなるから下から描いていくんだよ
- 717 名前:デフォルトの名無しさん [2021/06/14(月) 15:32:51.34 ID:TE2ntQhj.net]
- for(int a=0; ...; ...){...} とかはループ内だけのスコープで int a が使えるのに
int a; while(a){...} とか int a; do{...}while(a); とかは while(int a=...){...} ←これだけはOK? とか do{...}while(int a=...); とか do{int a; ...}while(a); みたいに書けないのはなぜ?
- 718 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 15:40:36.46 ID:peg/OyGg.net]
- do{...}while(int a=...); 宣言より前に変数を使用する
do{int a; ...}while(a); スコープの外に変数を持ち出す
- 719 名前:はちみつ餃子 mailto:sage [2021/06/14(月) 17:56:57.54 ID:fvxG9/iR.net]
- >>694
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。 たとえば while の文法は while ( expression ) statement というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。 で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。 そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、 繰り返しの構文のときだけ特別扱いということは出来んのだわ。 > while(int a=...){...} ←これだけはOK? これは C++ では良いけど C では駄目
- 720 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 18:58:23.47 ID:HtMoZ8Hn.net]
- 小さいスコープの中だけで使う自動変数だってんで
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある
- 721 名前:デフォルトの名無しさん [2021/06/14(月) 21:48:16.36 ID:OzvaLd6A.net]
- C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?
- 722 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 21:53:52.73 ID:VOy4fGQR.net]
- 標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど
- 723 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 22:00:33.63 ID:eQ9/Z+Eb.net]
- >>694,696
C++でもwhileの判定式中の宣言は毎回新しくなるんで、使いみち思いつかん。 while(int i=10) { i--; } は、無限ループになる。 できるとしたら、処理が終わったらすぐに始末したいobjに対して、 { myclass obj(); while(obj) { obj.some_op(); } } (obj は operator bool() とか実装してる前提) が、 while(auto obj = myclass()) { obj.some_op(); } こんな風にかけてちょっと{}がスッキリするくらい?(実際はobjが毎度構築される)
- 724 名前:デフォルトの名無しさん [2021/06/14(月) 23:04:55.36 ID:wv1U8ajF.net]
- カラス括弧!
初めて見た!
- 725 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 08:13:38.32 ID:4rRZmg7L.net]
- >>700
まあ while(...){} は for(; ...;){} で書けるしメリットないかな ただ do{ int a = …; }while(a); の方は書けたら嬉しいな 使用頻度は低いけど
- 726 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 10:57:08.11 ID:5dh+WKsO.net]
- do は do .. while(0) のパターンしか使わないな。
- 727 名前:デフォルトの名無しさん mailto:sage [2021/06/17(木) 23:23:03.28 ID:Gx3mnqFH.net]
- break用なら switch(0)default:{...} っしょ?
- 728 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 08:43:02.57 ID:R4m5mk7U.net]
- それdoよりどういうメリットある?
わざわざdefault:書かないとならないしインデント深くなりそうだし。
- 729 名前:デフォルトの名無しさん [2021/06/18(金) 11:21:27.64 ID:FZUuAAIq.net]
- マクロで展開するならインデントは無視できる
- 730 名前:デフォルトの名無しさん [2021/06/18(金) 11:50:10.76 ID:7Huy+AZL.net]
- do{}while(0) は最後に ; 書く前提だし矛盾ないけど
switch(0)default:{...} は ; の扱いの困らない?
- 731 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 11:55:35.37 ID:AVf6Ht59.net]
- for (int i = 0; i < 1; i++)
- 732 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 12:32:57.03 ID:6AzE04jr.net]
- { } 内スコープからの脱出で break; 使いたいってのと
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0) do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ if (<condition>) foo(arg); else <elsecase>; とかが
- 733 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 13:25:48.49 ID:7Huy+AZL.net]
- while(1){
... break; // } の直前 } で良いと思う
- 734 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:27:23.16 ID:tn5JYHw4.net]
- それどういう意図があんの?
処理は結局1回 スコープだけじゃダメなん?
- 735 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:44:41.04 ID:tzOvIsZE.net]
- >>710
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダ
- 736 名前:Tいと思うから do { ... } while(0); にするわ []
- [ここ壊れてます]
- 737 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 20:29:59.97 ID:R4m5mk7U.net]
- >>706
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。 セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと やっぱりインデントが変になるとか。
- 738 名前:デフォルトの名無しさん [2021/06/19(土) 12:53:56.96 ID:EDF+B3Dq.net]
- #define breakblock switch(0)defalut:
でいいやん できないとか怪しげとか意味不明 マクロ化する必然性がそもそもわかんないけど
- 739 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 13:08:34.87 ID:AhXAE8oj.net]
- そこまでして switch(0) 使う理由がよくわからん。
do while(0) と比べてどういうところが良いの?
- 740 名前:デフォルトの名無しさん [2021/06/19(土) 13:21:09.67 ID:ylfkd6bV.net]
- マクロの例でもわかるように波括弧を単独で使える
変な処理が始まってんの一目瞭然 continueもgotoで(goto使わない別ルーチン探せよw 等 #define breakblock(a) uniqelonglongprefix##a:switch(0)default: #define bbcontinue(a) goto uniqlonglongprefix##a
- 741 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 14:04:38.18 ID:AhXAE8oj.net]
- >マクロの例でもわかるように波括弧を単独で使える
ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。 わからんでもないが、自分はマクロや default: より気にならないからいいや。
- 742 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 16:30:22.52 ID:8gjebq3e.net]
- #define foo(arg) switch(0)default:{ なんとかかんとか }
これはキモイ
- 743 名前:デフォルトの名無しさん [2021/06/20(日) 18:26:02.94 ID:3hmKhJNO.net]
- でもその構文はdefineで置き換え前提で使ってるとしか思えない
- 744 名前:デフォルトの名無しさん mailto:sage [2021/06/20(日) 19:15:11.97 ID:XoXh1cqB.net]
- goto書くと死んじゃう人は大変だなぁ
Dijkstraもそこまでは言ってないらしいぞ
- 745 名前:デフォルトの名無しさん mailto:sage [2021/06/20(日) 22:56:11.58 ID:R7oo70Ox.net]
- ナンチャラカンチャラの人のdefine使用意図が無意味すぎてどうもc言語エアプなんじゃないかと疑う
- 746 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 16:42:57.66 ID:iJjBc6fp.net]
- switchのやつは最後にbreakかfall throughってコメント書いとかないと文句言うチェッカとかありそう
- 747 名前:デフォルトの名無しさん mailto:sage [2021/06/29(火) 11:07:55.25 ID:HA4DrIsJ.net]
- do {
int a; : } while(a); ↓ for(int a;;) { : if(!a) break; } でいいんじゃない?
- 748 名前:デフォルトの名無しさん mailto:sage [2021/07/05(月) 16:13:31.07 ID:3/iVgePD.net]
- 別のところで質問したのですが、初心者歓迎スレのほうがいいと思いこちらで質問し直します。
Macのclang++でコンパイルしています。 cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
- 749 名前:デフォルトの名無しさん mailto:sage [2021/07/06(火) 01:49:57.37 ID:w3zU8vH7.net]
- >>724
手元のM1のでやったら普通にエラーになるけど? printf("%d",rand()); だけ書いたやつ。 clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。 すまん、役に立てなくて。
- 750 名前:はちみつ餃子 mailto:sage [2021/07/06(火) 05:58:16.49 ID:kwaneL8R.net]
- >>724
ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。 たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。 ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。 -M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを 抽出できるからそれで確認できるよ。
- 751 名前:724 mailto:sage [2021/07/06(火) 08:23:42.
]
- [ここ壊れてます]
- 752 名前:24 ID:9fUGxcs8.net mailto: >>725
ありがとうございます。M1のclangではエラーが返るのですか…。コンパイラのバージョンの問題ですかね? >>726 ありがとうございます。-M試してみました。 インクルードはiostreamだけにしていたのですが、ぞろぞろヘッダーファイル出てきまして、その中にcstdlibもstdlib.hもありました。 iostreamのインクルードを外すと当たり前でしょうが、それらのヘッダーファイルは表示されなくなりました。 つまり、iostream以下のヘッダファイルの依存関係にcstdlibがいたということですよね? これは処理系依存なのでしょうか? [] - [ここ壊れてます]
- 753 名前:はちみつ餃子 mailto:sage [2021/07/06(火) 08:56:08.30 ID:kwaneL8R.net]
- >>727
処理系依存だと思う。 iostream が暗黙に include すると仕様に明記しているのは ios, streambuf, istream, ostream の 4 つ。 https://timsong-cpp.github.io/cppwp/n3337/iostream.objects.overview あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、 それ以上のことについてはっきりしたことは書かれてない。 rand が必要なら (たとえ実態として間接的に cstdlib が include されていても) プログラマは明示的に cstdlib を include するほうがいい。 というか、そもそも論としてはいまどき rand を使うのは避けるほうが賢明な考えだと思うけどね。
- 754 名前:724 mailto:sage [2021/07/07(水) 08:49:49.95 ID:O+5oUfAp.net]
- >>728
なるほど、そもそも論まで含めてよくわかりました! ありがとうございました!
- 755 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 19:37:14.99 ID:We+HIKc2.net]
- C言語にpthreadを使ってマルチスレッドにするときの初歩的な質問をしたいのですが、
大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という 説明はわかった気がします。 では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を 知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の 別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。 それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。
- 756 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 19:46:28.14 ID:TIX9j1Dy.net]
- 必要ないぞ
- 757 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 21:27:55.69 ID:wrMb4YqN.net]
- 必要だぞ
- 758 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 21:31:49.00 ID:RRTM5Oms.net]
- >>730
スレッド実行中に書き換わる可能性があるなら必要。 変数を読むといってもCPUは一度内部のレジスタに読み込まないと処理できないので、 スレッド1でレジスタに読み込む→スレッド2で変数を書き換える→スレッド1に結果が反映されない という事態が発生する可能性がある。
- 759 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 22:32:02.32 ID:eGF9BJZ0.net]
- >>733
それ反映する必要ないだろ 単にスレッド1が先に読んだだけだし それより読み書きがアトミックでないなら読み出し時にも排他しないと書き換え中の変な値を読んじゃうかと
- 760 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 01:06:02.19 ID:iVyIfxP9.net]
- 書き換え後に古い値を取得してもええの?
- 761 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 04:35:16.68 ID:jD2ZKaD3.net]
- ええ場合もある
「単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ」はそれでええ場合のように聞こえるな
- 762 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:28:04.15 ID:TJHT9gxK.net]
- ええ場合も何も読んだ後で書き換えられたのをどうやって反映させるつもりなんだよ…
- 763 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:33:10.76 ID:Tru2G6zE.net]
- 関連する操作すべてを優先順付きキュー経由にし
巻き戻し必要な操作にはジャーナル機能も入れ やり直し再キューすんのよ
- 764 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:36:14.97 ID:N1Z7W
]
- [ここ壊れてます]
- 765 名前:Bqy.net mailto: 別スレッドからflgをいじって停止できるように
while (flg) {...} と書いても、{...}の内部でflgをいじってないなら、 最適化で単なる無限ループに書き換えられて、flg変えても止まらない、 みたいな話なかったっけ。 [] - [ここ壊れてます]
- 766 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 06:47:09.06 ID:TJHT9gxK.net]
- >>739
それはまた違う話 volatile c言語 とかでぐぐれ
- 767 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 07:11:18.51 ID:JKFXuD7+.net]
- スレッドAが 16bit長の整数を書き換える
スレッドBが 同じ16bit長の整数を読み込もうとしたとき 8bit長でしかアトミックな操作が保証されてないシステムだと 初期状態 0x0000 で スレッドA が 0xFFFF と書き換える A書き込み 上位FF (スイッチ) B読み込み 上位FF B読み込み 下位00 (スイッチ) A書き込み 下位FF こういうことが起き得るという話でいいんかな
- 768 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:27:22.56 ID:N9R+gZBb.net]
- >>734
いや、先に読んだだけっていっても、例えば i f (v==1) みたいな条件式を評価した段階では1だったけど、その先で急に2に変わった、とかだったらまずいだろw
- 769 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:34:33.02 ID:EesV0O7a.net]
- 質問者の文言が
>単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ >読みに行った瞬間の値を知りたいだけ なので必要なし 以上
- 770 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:39:13.41 ID:fOJ6OsHP.net]
- >>742
何もまずくないだろ…
- 771 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:48:41.36 ID:N9R+gZBb.net]
- >>744
ifの中ではもう一度vの値を読んだときには2になってたりするわけよ vが1の前提で書いたコードの中に2を突っ込んだらまずいよ
- 772 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:11:07.28 ID:16vz6VAu.net]
- >もう一度vの値を読んだとき
まずいのはこっちであって>>742のifや>>733自体は問題ないんでは。
- 773 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:15:23.13 ID:nctQkkF+.net]
- 質問者が言ってないことに加えて勝手に仮定を追加してまずいとか言ってる>>745はもう黙ってほしい
- 774 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:51:11.89 ID:6bm+w6Lu.net]
- まずいのは>>745の頭だったというオチw
- 775 名前:はちみつ餃子 mailto:sage [2021/07/10(土) 09:56:52.21 ID:11oc3t46.net]
- >>730
結論から言うとロックは必要。 同一のメモリに対するアクセスの少なくとも一方が書き込みである場合には衝突すると定義されている。 https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#4 その場合にはデータ競合が発生する。 https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#21 同時に起こりうるアクセスの内でひとつでも書き込みが存在したらそれはデータ競合の可能性があるってこと。 ミューテックスはミューテックスの所有権を取り合うことで競合を阻止する仕組み。 ロックというのは「ミューテックスをロックする (ロックしている間は自分がミューテックスの所有権を持っている)」 ということであって、対象となるデータそのもののアクセスを直接的に制御してるわけじゃないので、 書き込み側でロックするだけでは意味がない。
- 776 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 10:17:52.46 ID:fOJ6OsHP.net]
- >>749
at least one of which is not atomic の意味ぐらいは理解してからレスしなよ
- 777 名前:デフォルトの名無しさん mailto:sage [2021/07/12(月) 08:43:59.78 ID:Y3qBMERg.net]
- >>749
質問者は衝突しても問題ないケースで排他は必要かどうかを聞きたいんだろ
- 778 名前:デフォルトの名無しさん mailto:sage [2021/07/12(月) 12:14:53.15 ID:uJpO0uZ2.net]
- 「衝突しても問題ない」&atomicも使わない=「データ競合となっても問題ない」=「動作が未定義でも問題ない」なら
確かにロックは不要だけど。
- 779 名前:730 mailto:sage [2021/07/12(月) 15:19:59.68 ID:VxiBn2TN.net]
- 730です、どうもお騒が
- 780 名前:ウせしております。
どうやら読み出しだけのときも基本的にはミューテックスを使うべきのようですね。 私の場合は域変数をカウンタとして使っていてその値をログ出力する、というような状況で、 なんとなくミューテックなしでもいいかと思ったのですが、ミューテックスを使わない場合は 気持ち悪い値がプリントされている感じですかね。 一般的な状況では、ミューテックスを使わなくても実害がないかを考えるよりはちゃんと ミューテックスを使った方がよさそうですね... [] - [ここ壊れてます]
- 781 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 17:41:58.36 ID:DZW75fJj.net]
- 「今値を書いてるから 書き終わるまで待て」と待たす相手は
次にそこへ書き込むヤツだけじゃなく そこを読込もうとしたヤツも対象にしとけば ちゃんと書き終わった値が読込める 中途半端に書いてる最中であっても意図的に抜き出したいのなら 書き終わるまで待たずに読む そしてみゅーてっくすの激しい握り合い
- 782 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 19:15:08.97 ID:Cs3wNevb.net]
- >>753
単純なカウンタみたいなアトミックに読み書きできるような変数なら排他は不要だよ
- 783 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 20:10:22.43 ID:+UxqO86S.net]
- >>755 なんでそんな嘘を教えようとするの?
- 784 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 20:55:03.74 ID:Cs3wNevb.net]
- >>756
>>749のリンク先読めばわかると思うけど競合が発生して結果が未定義になるのは > at least one of which is not atomic のケースね
- 785 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 21:33:13.25 ID:+UxqO86S.net]
- >>757
そこで言ってる "atomic" の意味は std::atomic<int> ならOKで int はダメという話なんだけど、 「単純なカウンタみたいなアトミックに読み書きできるような変数」って言い換えちゃったらどっちもOKに読めちゃうでしょ。
- 786 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 21:39:13.87 ID:Cs3wNevb.net]
- >>758
intがダメなのは>>741みたいなケースね > 「単純なカウンタみたいなアトミックに読み書きできるような変数」 でだめだと言うなら実例教えて
- 787 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 22:40:14.76 ID:31Jksjnm.net]
- 単純なカウンタがアトミックに読み書きできるかは
基本型の宣言だけではわからんから アトミック化の指示ができるならやっとけ ということでいいんでないの?
- 788 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 22:49:59.37 ID:Cs3wNevb.net]
- >>760
そのスタンスでいいと思うよ 俺はアトミックに読み書きできるケースなのに嘘とか言ってる>>756がなんか特殊なケースを知ってるのかな?って思ってるだけ
- 789 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 23:59:32.08 ID:31Jksjnm.net]
- 指示ができない場合にはアトミックに操作できる保証なんてないから
排他したほうがいいぜって立場
- 790 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 00:44:44.53 ID:pCGEFvrX.net]
- >>759
生の int に複数スレッドから排他なしでアクセスしてたらその時点で未定義動作=ダメなんだってば。 未定義動作となる場合に必ず期待に反するコードが生成されるわけでもないんで、実例を出せというのも意味が無い。 (実例が無いからといって「敢えて」未定義動作に誘導するというのは意味が無いどころか有害。) ・・・スレッドサニタイザで引っかかってウザい、とか言えば「実例」として納得してくれるの?
- 791 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 01:04:57.94 ID:b90ql0x3.net]
- 生のintへのアクセスがアトミックに行えるかって処理系が保証したりしないのけ
- 792 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 05:39:14.15 ID:dtsN+T48.net]
- https://stackoverflow.com/questions/35226128/are-c-c-fundamental-types-atomic
- 793 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 06:51:23.81 ID:3FmZNcD6.net]
- >>764
保証してる処理系なら std::atomic<int> でオーバーヘッドは生じない、つまり排他は要らんってことでしょ >>756がなんか実例知ってるかと思ってたけど単なる規格厨だったなw
- 794 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 12:49:26.09 ID:pCGEFvrX.net]
- >>766
オーバーヘッドが生じるかどうかで考えてるなら(それもおかしいんだけど)、こんな例を見れば考えを改めてくれたり
- 795 名前:するの?
https://godbolt.org/z/6oM5oevsY #include <atomic> int load(std::atomic<int> const& x) { return x; } int load(int const& x) { return x; } ↓ARM64 gcc 11.1 -O2 load(std::atomic<int> const&): ldar w0, [x0] ret load(int const&): ldr w0, [x0] ret [] - [ここ壊れてます]
- 796 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 18:54:32.14 ID:VBWUb4q7.net]
- >>767
それメモリーバリアの話で排他の話じゃないけど、何を言いたいの?w
- 797 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 19:20:02.20 ID:pCGEFvrX.net]
- >>768
766 が「オーバーヘッドは生じない」ならば「排他は要らん」という論理らしいので 「オーバーヘッドは生じない」を否定すれば「排他は要らん」とかいう嘘を言わなくなってくれるかなと思って書いてみた。 オーバヘッドの発生と排他の要・不要とが 766 の頭の中でどう繋がってるのかは知らない。
- 798 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 19:25:42.08 ID:VBWUb4q7.net]
- >>769
まあメモリーバリアも一種のオーバーヘッドと言えなくもないがそういう話でないことぐらいはわかりそうなもんだけどねw で、排他が必要な例は見つかったの?
- 799 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:14:07.80 ID:pCGEFvrX.net]
- >>770
ごめんよ。元から意味が分からなかったところ「オーバーヘッド」の意味が何か文字通りの意味じゃなかった みたいだし、もうどういう話なのかさっぱりだわ。 767 の「オーバーヘッド」が何を指すのか、それと排他の要・不要との繋がりがわかるようだったら解説よろしく。 「排他が必要な例」と言われても、こっちとしては複数スレッドで生の int を読み書きするなら 常に排他が必要という認識なんで文字通り「排他が必要な例」なら無数にあるんだよね。 そういうのを挙げても謎理論で「不要だろ」とか「コレジャナイ」って言うだけで話は進まなさそう。 ここまでの流れを読めば >>755 をうっかり信じちゃう人もいないだろうし、もう放置でいいかなという気になってる。
|

|