- 1 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 11:23:05 ]
- マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/test/read.cgi/tech/997345868/ その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/
- 710 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 15:36:23 ]
- >>691>>707
>>708の言うように、 「CASの第2引数の値」と「CAS呼び出し時に*addrに入っている値」 これが違うのは問題ないが 「CASの第2引数と第3引数の値の差」が1でない場合に誤動作する。 コンパイラの最適化で読み出しが1回になるケースもあるだろうが 最適化オプションで動作が異なるのはデバッグを難しくするだけ。 volatileを使えば、読み出しが2回になることが保証されるだけ。
- 711 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 13:37:43 ]
- 一般的な双方向リストをマルチスレッドで使うとまずいですか?
new -> next = next; /* ここでスレッドが切り替わるとか? */ new -> prev = next -> prev; みたいな事が起きるとうまく繋げないような気がします。 WinAPI を使ってオブジェクトかなにか?を作って排他制御する 必要があるのでしょうか?
- 712 名前:デフォルトの名無しさん [2006/07/31(月) 13:41:09 ]
- 問題ないw
- 713 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 15:11:21 ]
- >>711
まずい。複数スレッドからappendすると、ノードが行方不明になったりする。 ただ、スレッドセーフな双方向リストにするより、 外部の同期オブジェクトを使ってそのリストへのアクセスを同期化する方が 柔軟。
- 714 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 06:53:40 ]
- volatileですべて解決!!!
- 715 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 10:44:44 ]
- この話では無理w
- 716 名前:デフォルトの名無しさん [2006/08/01(火) 11:20:51 ]
- >>711
問題ない 関数内ではスレッドの切り替えは起こらない
- 717 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 11:51:13 ]
- preemption はいつでも起こりうるでしょ
- 718 名前:716 [2006/08/01(火) 12:39:23 ]
- 起こらないでしょ
- 719 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 12:43:33 ]
- >>716
何を根拠に言ってんの?
- 720 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 12:51:51 ]
- ようやくWindowsのメッセージディスパッチのことを理解したばかりのヒトが
それをマルチスレッドだと思い込んでるんでしょう。
- 721 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:19:11 ]
- >>716 は、ユーザレベルスレッドしか使った事無い人なんでしょうかね。
- 722 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:23:44 ]
- >>716はWin3.1ユーザー
- 723 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:24:48 ]
- 実装がユーザレベルかカーネルレベルかと、プリエンプティブかコ・オペレーティブかは関係ないだろ。
- 724 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:33:14 ]
- 関数内では起こらないってのもすごいよな。
普通は全てmainの関数内なんだが。 まあWndProcはまた別だが、それもWinMain内ででGetMessageしてるわけだし。
- 725 名前:716 [2006/08/01(火) 14:35:50 ]
- 反省^^
- 726 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 22:51:18 ]
- >>723
そこに異論は無いけど、言いたい事は分かるでしょ。
- 727 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 08:14:08 ]
- まあ、あれだ。がんがりたまえ(笑)
- 728 名前:デフォルトの名無しさん [2006/08/02(水) 12:46:56 ]
- 一般的なのはミューティックスを作る方法なの?
- 729 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 13:49:28 ]
- ディスクトップでディスクリプタをミューティックスで保護することを考察
- 730 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 14:34:13 ]
- むてふ
- 731 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 14:47:18 ]
- ティキストエデタ
- 732 名前:デフォルトの名無しさん [2006/08/02(水) 15:05:17 ]
- www
- 733 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 23:11:34 ]
- ヴォラタィル
- 734 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 08:56:51 ]
- コンピゥタァ
- 735 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 12:30:55 ]
- モシ NO=735 ナラバ トベ >>1000
- 736 名前:デフォルトの名無しさん [2006/08/03(木) 14:38:59 ]
- static bool g;
if (!g && g = true) {} この if ()の中でスレッド切り替えって起こります? 排他処理になりませんか?
- 737 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 14:54:43 ]
- >>736
その g = true というのは本当に g = grue なのか? それとも g == true の書き間違い?
- 738 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 14:56:56 ]
- あ、俺も書き間違えた。すま。
- 739 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 15:47:48 ]
- >>736
> この if ()の中でスレッド切り替えって起こります? 起こる > 排他処理になりませんか? ならん
- 740 名前:デフォルトの名無しさん [2006/08/03(木) 18:52:39 ]
- w
- 741 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:56:53 ]
- ちょっと待てよ。C言語だとするとショートサーキットだよな?
!g の結果が false なら g = true は実行されないよな。 true なら実行される。 排他になるんじゃないか?
- 742 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:01:59 ]
- ひょっとしたら
!g がアトミックじゃない処理系もあるかも
- 743 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:02:10 ]
- ショートサーキットは関係ない。
!gの評価と、g=trueの間にスレッドが切り替わる可能性があれば、排他として役に立たない。
- 744 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:31:23 ]
- アセンブラレベルで考えるんだ
- 745 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:49:20 ]
- なんだろ? 書き込み見てると、CPU命令レベルでの挙動に思い至らないのが居るな。
ソースレベルの字面で捉えてコンパイルというのが何なのかまったく知らないよう に思える。 こんなんで日本のプログラマーのレベルは大丈夫なのか? 小中学生だったら 知らなくても無理は無いのか。
- 746 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:44 ]
- アセンブラまで降りる必要は必ずしも無いとは思うが
メモリの読み込みと書き出しを同時(atomic)に行うことは (普通は)出来ないということくらいは知っておく必要がある。 もちろん、プロセッサはそのための命令を(普通は)用意しているが コストがかかるため、普通にソースを書いた場合 コンパイラはその命令を使ったコードは出力しない。
- 747 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:16:40 ]
- えらそうに講釈たれてても
> 同時(atomit) この一言で台無しだな。
- 748 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:25:35 ]
- >>747
お前いらないから
- 749 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:36:58 ]
- 必死な子がいるなぁ。
- 750 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:39:29 ]
- >>747
別のプロセッサに割り込まれないように lock等で保護してからxchgしたりincしたりnegしたりするけど それをatomicと言わないとでも? 例えばあるメモリの内容を+1する場合、 「+1する命令をメモリに対して発行する」ではなくて 「プロセッサがメモリを読んで、+1した値をメモリに書き込む」だし。
- 751 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:58:41 ]
- なに一生懸命説明してるの?
これスレでそんなこと知らない奴なんてあまりいないよ。 俺はただ「atomic」と「同時」って全然違うって言いたいだけなんだが。 まあ俺も atomit とか書いてるようじゃ人のことは言えないわな。(w
- 752 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:03:37 ]
- >>751
もう消えてね(^^)
- 753 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:18:24 ]
- >>751
ずいぶん必死ですね。
- 754 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:20:13 ]
- 最近なりを潜めてる、某キティと文体が似てる・・・
- 755 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:02:29 ]
- 読むのと同時に書かないと壊れるメモリもあるだぜ?
- 756 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:19:47 ]
- 「atomic」は日本語で言ったら「不可分」ちうことですわ。
- 757 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:23:06 ]
- 原子力って感じかと思ってた
- 758 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 03:38:13 ]
- 分割不可能な最小単位つうことですょ
- 759 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 03:51:04 ]
- つまり、鉄腕アトムは分割不可能と言うことで宜しいか。
- 760 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 04:08:01 ]
- 「atomic」には他に「原子の」みたいな意味もあるんですわ。
昔は原子(atom)は物質の不可分な最小単位と考えられていたので。 どっちの意味が先か知らんけどね。
- 761 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:05:02 ]
- で、何が言いたいんだ?
- 762 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:11:33 ]
- atomic bomb 分割不可能な爆弾
- 763 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:12:41 ]
- 割ったら被爆しちゃうからね
- 764 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:17:17 ]
- >>761
誰でも知ってるような事をちょっと偉そうにしゃべくってみたかっただけですわ。
- 765 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:18:59 ]
- 被爆と被曝
- 766 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:55:02 ]
- >>764
何のために?
- 767 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:57:34 ]
- >>760
なに一生懸命説明してるの? これスレでそんなこと知らない奴なんてあまりいないよ。
- 768 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 08:37:02 ]
- 「同時」って書いちゃうヤツ以外はね。
- 769 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 08:45:15 ]
- VRAM(昔のやつ)やWRAM(初代Milleniumが採用した奴)を思い出した。
- 770 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 09:45:01 ]
- >>768
どこが変なのか未だにわからんのだが? 「読み込みと書き込みが同時に出来ない」 だから 「読み込みと書き込みをatomicに出来ない」(バスロックしなければ) という意味なんだけど?
- 771 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 09:48:31 ]
- >>764
俺は知らなかったからタメになりましたよ 一応ありがとう
- 772 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 09:53:42 ]
- この流れ見て、コンカレントとパラレルの違いが理解出来なかった当時を思い出した
- 773 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 10:49:55 ]
- 既に「atom」という言葉があるからこそ、物質の探求の過程で原子にその言葉を当て嵌めたってことくらい
>758を理解していたら考えるまでもないだろ。
- 774 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:02:32 ]
- >>770
同時(simultaneous)と、不可分(atomic)の違い。
- 775 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:03:28 ]
- 意味が分からねえ・・・
- 776 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:10:09 ]
- >>770
恥の上塗り
- 777 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 12:38:57 ]
- ガキ共の言葉遊びここまで
- 778 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 12:49:23 ]
- じゃあ今から大人の言葉遊びか・・・エロス
- 779 名前:736 [2006/08/04(金) 13:14:37 ]
- if (g = g ? false : true)
この場合でも排他にならない?? アホですまん
- 780 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:19:58 ]
- C言語のレベルでどの式がアトミックになるかという事に依存するのが間違いだと思う。
現存する全ての環境でアトミックに実行されるような式でも、それは処理系依存。
- 781 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:21:37 ]
- その後、原子は分割可能であることが判明してしまいました。
- 782 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:25:55 ]
- 陽子と電子に分割できるんだっけ?
- 783 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:27:46 ]
- あと中間子
- 784 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:40:08 ]
- それらの素粒子も実は更に……
つーのはやめておこうか。
- 785 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 14:05:25 ]
- >>779
そもそもどう排他したいの?
- 786 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 14:21:49 ]
- mkdir() は atomic らしい
- 787 名前:779 mailto:sage [2006/08/04(金) 14:38:19 ]
- リスト処理でつなげるときに排他したいけど
WinAPI使うしかないみたいですね
- 788 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 14:39:02 ]
- デッドロックになってしまった場合に
一定時間後に解除するような作りにしたいとき mkdir() だと unlink() すると atomic では なくなってしまう危険があるので rename() の方が良いそうです www.din.or.jp/~ohzaki/perl.htm
- 789 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:16:39 ]
- >>779
もう諦めて、素直に同期オブジェクト使いなさい。
- 790 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:28:11 ]
- mutex使わないのはなぜですか
- 791 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 17:00:56 ]
- Windowsでプロセス内だけでいいならCriticalSectionのほうが速いんじゃなかったっけ
- 792 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 18:32:01 ]
- >>787
それならCriticalSectionで十分
- 793 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 18:35:59 ]
- >>787
これもAPIになるけど、InterlockedCompareExchangeとかでも自分でロックを作れる。 ただ、CriticalSection使うほうが簡単でおすすめ
- 794 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 22:35:03 ]
- >>755
> 読むのと同時に書かないと壊れるメモリもあるだぜ? kwsk
- 795 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 22:42:15 ]
- それはリフレッシュのことかね。
- 796 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 22:56:05 ]
- 「メモリなどの外部デバイスに対して複数の入出力をatomicに行うには同時にやるしかない。ロックしないならば」
という文章があったとします。 この文章の最後を無視して 『メモリなどの外部デバイスに対して複数の入出力をatomicに行うには同時にやるしかない』 だけを引用して 「ロックすればいいじゃん。バカじゃねーの?」 と書き込むのは、とても恥ずかしいですね。 では、前半部も無視して 『atomicに行うには同時にやるしかない』 だけを引用し、 「同時とatomicは違うだろ。バカじゃねーの?」 と書き込むのは、どのくらい恥ずかしいことなんでしょうかね。 まあ夏休みだから、「こくご」の能力がちょっと不足している人が現れるのも 仕方ないかもしれませんが。
- 797 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:29:16 ]
- 746 名前:デフォルトの名無しさん:2006/08/03(木) 23:05:44
アセンブラまで降りる必要は必ずしも無いとは思うが メモリの読み込みと書き出しを同時(atomic)に行うことは (普通は)出来ないということくらいは知っておく必要がある。
- 798 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:34:11 ]
- >>797
ロックすれば、読み込みと書き出しを同時に行わなくてもatomicに実行できるよ
- 799 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:43:27 ]
- >>795
D-RAM は、読んだらデータが壊れるから再書き込みするけど、 あれは読んだデータを後から書き込んでるから同時じゃない。 正解を教えてくれ >>755 >>796 > という文章があったとします。 どこに? 君の脳内? ちょっと頭冷やせよ。
- 800 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:45:22 ]
- そんなの基礎知識でしょ
- 801 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:47:39 ]
- 文脈や前提を無視して言葉尻をとらえるのが大好きな方がいらっしゃるようで。
- 802 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:48:16 ]
- で、そういう人には揶揄や皮肉は通用しませんね。
- 803 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 00:15:01 ]
- 746 名前:デフォルトの名無しさん:2006/08/03(木) 23:05:44
アセンブラまで降りる必要は必ずしも無いとは思うが メモリの読み込みと書き出しを同時(atomic)に行うことは (普通は)出来ないということくらいは知っておく必要がある。
- 804 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 00:28:38 ]
- >>787
排他だけなら、アセンブラとか、asm文とか使えばいいけど、 CPUを離すのは、API使わないと無理。 # というか使った方がいい。 # ユーザランドだけで実装されたマルチスレッドライブラリもあるけどさ。
- 805 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 00:31:32 ]
- 破壊読み出しなのは、コアメモリもそう
- 806 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 01:45:45 ]
- >>803
もちろん、プロセッサはそのための命令を(普通は)用意しているが コストがかかるため、普通にソースを書いた場合 コンパイラはその命令を使ったコードは出力しない。
- 807 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:10:07 ]
- ( ゚д゚)ポカーン
- 808 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:18:37 ]
- 急に暑くなったからな。
そっとしておいてやれ。
- 809 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:23:40 ]
- 最近近くに引っ越してきたvolatile asmというものですが何か?
- 810 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:31:33 ]
- >>746
|

|