1 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 19:26:16 ] マルチスレッドプログラミングについて語るスレ ■前スレ マルチスレッドプログラミング相談室 その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/ ■過去スレ その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/ その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/ その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他突起する事項】
885 名前:デフォルトの名無しさん [2009/09/13(日) 02:31:59 ] Art Of MultiProcessor本の10章 ABA問題Pragma10.6.1のところで CompareAndSet(T expectedReference, T newReference, int expectedStamp, int newStamp) ってなメソッドが定義されてる。 これってDCASっぽいのだが 質問は説明の後半 「C/C++でやるなら64bitアーキテクチャなら"stealing"bits from pointer, 32bitアーキテクチャでも間接参照?でできる(although a 32-bit architecture woild probably require a level of indirection.)」 ってあるがどうやるんだ? わかる人、教えて。
886 名前:デフォルトの名無しさん [2009/09/13(日) 02:51:31 ] 上の質問の追記 ReferenceとStampがどっちも小さい値なら 例えばintegerの上と下で16bitづつつかって maskで値を取り出すとか工夫できるだろうけど、 例えば32bitマシンで referenceもstampもどっちも32bitの値を使う場合にどうするんだろう ってのが質問。
887 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 09:02:36 ] そりゃペアで保持するオブジェクトの領域作って そこへの参照をCompareAndSetするんじゃないの?
888 名前:デフォルトの名無しさん [2009/09/13(日) 11:05:39 ] >>887 cmpxchg使ったことある? 質問変えると x86、Cでcmpxchgでどう書くか
889 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 11:18:48 ] 俺も普通に>>887 としか思えないし>>885 の英文もそう読めるしCASも理解してるが
890 名前:デフォルトの名無しさん [2009/09/13(日) 11:34:02 ] 俺わかんねorz 具体的にCとgasで疑似サンプルコード書いてもらえると助かる
891 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 11:58:41 ] >>890 金かかるよ? 高いよ? いいの?
892 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 12:01:27 ] いいよ。>>890 にツケとけ。
893 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 12:36:05 ] みんな ほんとにできんの? 64ビットと32ビットのアーキテクチャのアプローチの違いもいわず ただ「オブジェクトつくって...」って 分かった気しただけで実装したことないんちゃうか cmpxchg使うんだよ
894 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 12:46:12 ] >>893 cmpxchg直接使うってバカか勉強中の学生以外 使わないと思うけど? キミいくつなの?レベル低すぎなんだよね〜
895 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 14:31:59 ] x86前提ならそもそも64ビットCAS命令がネイティブでなかったっけ?
896 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 17:11:34 ] >>x86前提ならそもそも64ビットCAS命令がネイティブでなかったっけ? 元の質問読んだ? DCASっぽい動きをCAS命令でやるのってどうやるのって話。 誰も64ビット版ではstealing bits、 32ビット版ではindirectionの意味も語らず、 厨房よばわりしてるけど 誰も原著を読み込んでないし実装もできないじゃないか >>cmpxchg直接使うってバカか勉強中の学生以外 >>使わないと思うけど? >>キミいくつなの?レベル低すぎなんだよね〜 ようするに出来ないんだろ
897 名前:デフォルトの名無しさん [2009/09/13(日) 17:19:40 ] >>894 このメソッド、 x86の32ビットと64ビットの両アーキテクチャ上で Cで実装してみ? cmpxchg使わないでw public boolean compareAndSet(V expectedReference, V newReference, boolean expectedMark, boolean newMark) 「現在の参照 == 予想される参照」であり、現在のマークが予想されるマークに等しい場合、参照およびマークの値を指定された更新値に原子的に設定します。 パラメータ: expectedReference - 参照の予想される値 newReference - 参照の新しい値 expectedMark - マークの予想される値 newMark - マークの新しい値 戻り値: 成功した場合は true
898 名前:デフォルトの名無しさん [2009/09/13(日) 17:20:42 ] IntelのTBBってどうですか 使える? これから主流になる?
899 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 17:28:52 ] 一部はC++0xに取り込まれるので、やっておいて損はないと思う。
900 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 17:35:48 ] >>898 TBB使ったアルゴリズムが100%正しいのか 検証する手段がないから危険で使えないよ?
901 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 17:42:44 ] 原子的に、って訳は正直どうかと思う
902 名前:デフォルトの名無しさん [2009/09/13(日) 18:51:04 ] >>896 つttp://www.nagi.org/diary/?date=20090614#p01
903 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 18:55:38 ] 原子的に quark的に
904 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 19:40:00 ] 不可分的に
905 名前:デフォルトの名無しさん [2009/09/13(日) 21:07:54 ] 結局、ここの連中は自分じゃコードが書けない 知ったかばっかりなんだな
906 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 21:14:41 ] >>905 まず金を払え 話はそれからだ
907 名前:デフォルトの名無しさん [2009/09/13(日) 21:31:47 ] >>906 馬鹿らしいが相手にしてやると サンプルコードも書けない奴に先払いするやつなんていない。 slealing bitsってどういう意味だ? せめてこれの意味くらいきっちり説明してみろ。 全然わかってねえじゃねえか、このスレの連中w
908 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 21:58:35 ] >>907 キミってその解ってないと卑下する連中と同列なんじゃないの? ちなみに、煽れば回答でてくると思ってるでしょ?
909 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 22:15:16 ] >>907 キミってこんなのも書けないの? template<typename T> bool compareAndSet(T* const expPtr, T* const newPtr, const uint32_t expStamp, const uint32_t newStamp) { bool r = false; if(v == expPtr && s == expStamp) { TAS.lock(); if(v == expPtr && s == expStamp) { v = newPtr; s = newStamp; r = true; } TAS.unlock(); } return r; } TASぐらい実装できるよね?そこまでバカじゃないよね? Javaの実装とVCかgccのcompareAndSwapのインラインアセンブラ 組み合わせれば実装ぐらいできるでしょ?それもできないってレベル低すぎるでしょ? キミだめだわ
910 名前:デフォルトの名無しさん [2009/09/13(日) 22:47:13 ] えーとだな、 そもそもの質問はArtOfMultiProcessor本の Lock-Free Queueの実装なんで おお威張りでlock()使われると 失笑するしかないんだがなw 君は本当の馬鹿なんだね
911 名前:デフォルトの名無しさん [2009/09/13(日) 22:51:26 ] >>ちなみに、煽れば回答でてくると思ってるでしょ? 902に回答出てるじゃん。 できる人は出し惜しみしないで公開してるし回答もできるだろう。 ここに張りついてる連中は揚げ足とりばっかで 質問の本質も理解できない知ったかばっか
912 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 22:53:20 ] >>887 で終わってんのに何で続いてんの? >誰も64ビット版ではstealing bits、 >32ビット版ではindirectionの意味も語らず、 当たり前すぎて説明する必要があるとも思わんわ。 64ビットではポインタのビットから一部拝借してスタンプに使う。 32ビットではポインタとスタンプをまとめて直接ではなく、 ペアの領域を作成してそのポインタで間接的にCASを行う。
913 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 23:08:05 ] >>912 uint64_t expV = ((((uint64_t)expPtr) << 32) | ((uint64_t)expStamp)); uint64_t newV = ((((uint64_t)newPtr) << 32) | ((uint64_t)newStamp)); return (expV == CAS64(&ptr, expV, newV)); これでOK?
914 名前:デフォルトの名無しさん [2009/09/14(月) 00:17:59 ] >> 887で終わってんのに何で続いてんの? 909みたいなのが質問者を馬鹿にしたんで荒れたんじゃないの。 lock使ってCASを実装するような奴が威張り散らしてるのみて爆笑させてもらったよ。 いずれにしても知ったかが多いのが明らかになったのはよかったんじゃない。 >>912 当り前すぎたとしても、質問者みたいな初心者もいるから最初から説明してあげれば。
915 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 00:39:43 ] どう見ても、キミが質問者で 煽って回答を引き出してるだけに見えるけど。 週末だしね。
916 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 00:56:51 ] >>913 uint64_t expV = ((((uint64_t)&expPtr) << 32) | ((uint64_t)expStamp)); uint64_t newV = ((((uint64_t)&newPtr) << 32) | ((uint64_t)newStamp));
917 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 01:00:27 ] >>894 >>908 >>909 >>915 煽ってる同一人物なんで 無視の方向で
918 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 04:16:34 ] 火元の人 やり方が理解できない質問者 俺に分からないならこのスレにも理解できる奴いないんじゃね、とか思っていて、 それが態度にも滲み出ている 煽る人 分かってるつもりだけど分かってないで煽り続ける こいつを見た火元は「やっぱり分かってる奴いないんじゃないか」と思いこむ 住人タイプA 一目で分かるがお前の態度が気に入らないしコード示すのマンドクセ つーかこの説明で分かれボユゲ 住人タイプB みんな何言ってんだかわかんね