[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 06/04 17:21 / Filesize : 278 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

マルチスレッドプログラミング相談室 その4



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/

969 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 17:50:27 ]
>>965
> 結論はどうだったのでしょう?

自分で読もうと言う気はないのか?

> もしくは、現象が簡単に再現するプログラムの書き方があれば反例
> として文句をつける余地はありません。

そんなもんがあったら苦労はしない。

> もし検証プログラムに理論的なミスがあれば指摘してください。

検証プログラムで現象が出ないからと言ってプログラムが正しいと考える
お前の思考。


970 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:15:35 ]
>>923
とりあえず4CPUのマシンでも異常なしで動きましたのでご報告します。

971 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:29:14 ]
>>969
>検証プログラムで現象が出ないからと言ってプログラムが正しいと考える

>>923 さんはそんなこと言ってないと思いますよ。

少なくとも検証プログラムですぐに問題が出るなら使い物にならない
と考えてるだけでは?

972 名前:923 mailto:sage [2006/09/09(土) 18:57:46 ]
>>970
ありがとうございます。
こちらは1億回を10億回にしても問題出ませんでした。
Pen4の1CPU-HT環境と、Pen3の1CPUです。

ちなみに、類似のプログラムとしてaに加算するケースを
動作させてしっかりエラーになりました。マルチスレッド
でのコンテキスト切り替えとアクセスを検証するプログラム
として動作がある程度的を得ているからだと思います。

また、加算だとPen3ではぜんぜんエラーにならないのも面白いですね。
1CPUなのである程度予想してましたが、コンテキスト切り替えの状況
がHTと違うようです。

>>971
擁護どうもです。970の人?

↓ちなみに加算テストへの変更点ですが、

973 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 18:59:32 ]
 *     +    巛 ヽ
            〒 !   +    。     +    。     *     。
      +    。  |  |
   *     +   / /   イヤッッホォォォオオォオウ!
       ∧_∧ / /
      (´∀` / / +    。     +    。   *     。
      ,-     f
      / ュヘ    | *     +    。     +   。 +
     〈_} )   |                        
        /    ! +    。     +    +     * 
       ./  ,ヘ  |
 ガタン ||| j  / |  | |||
――――――――――――


974 名前:923 mailto:sage [2006/09/09(土) 18:59:57 ]
#elif 1 //インクリメントテスト
#define _INC
#define set_a(n) a++
#define get_a(v) v = a
int max = 0; //これはmain内のローカル変数でも良い
#elif 0 //Interlockedでインクリメントテスト
#define _INC
#define set_a(n) InterlockedExchangeAdd((long*)&a,1)
#define get_a(v) v = InterlockedExchangeAdd((long*)&a,0)
int max = 0;
:
:
と、以下がループ内抜粋
int t; get_a(t);
#ifndef _INC
if(t != 0x00001111 && t != 0x22220000)
printf("不整合発見(%d):%08x\n",++false_ct,t);
#else
if(max < t){
max = t;
}
if(max > t){
printf("不整合発見(%d)%d,max:%d\n",++false_ct,t,max);
}
#endif

です。HTマシンではInterlockedしないと一瞬でエラー続発です。


975 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 19:25:16 ]
面倒なので代入と加算とそれぞれのロックありなしの場合を
すべて同時にテストできるプログラムにしていただけませんか?
あと、レポートも不具合ありなしだけじゃなくて、使用CPU構成や
OSバージョンなども表示されると素敵ですね。
それから、ソースはここの数レス消費する貼り方せずに
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
あたりのうpろだを使っていただくのが
協力者以外のひとに迷惑かからなくてよろしいかと思います。


976 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 19:27:00 ]
お前用の検証スレじゃないんだけど。

もう言いたいことは言ったろ

うざいからwikiでも立ててそっちでやってくんね?

977 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 19:39:54 ]
どうしても書き込みたいならコテハンかトリップたのむ。



978 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 19:49:57 ]
>>976 みたいな馬鹿はおいといて
2chの住民に検証協力してくれというなら
>>975 くらいの準備はしても良いと思う

979 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 20:15:39 ]
結果報告なんかをここでやらないならいいよ
正直つまんないのでウンザリしてる

980 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 20:27:34 ]
>978

>975 は遠回しに断ってるんじゃないかな。

981 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 22:33:50 ]
>>943
根本的なところが馬鹿っぽいのに、
とても流暢に(内容的に脱力な)文章を書ける才能に感嘆する。


982 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 22:49:03 ]
>>975
どうせならワームとして世界中のPCにばら撒いて
宿主PC上の実行結果を自分宛てにレポートさせるように
実行させれば良いのでは?


983 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 22:56:43 ]
前々スレくらいでvolatile厨を繁殖させた者です。

この話題って、あの時のフラグ変化の検出の話題と凄く似ていると思う。
あの時は単なるフラグで、1ビットでも変化している事を検出できれば
良かったから、不必要にややこしくしそうで触れなかったんだけど。

前の時のポイントは、

1. メモリから読み込んだ値を利用(計算)した結果を書き込むのではなく、
  完全に新規な値をメモリに書き込む。
2. 更新前の古い値を他のプロセッサがキャッシュの関係で読み込んでも、
  伝搬されて更新された値を近いうちに読み込めればよい。

という前提において、

必ずしも同期を取らなくても動作に支障はないが、最適化による
レジスタへの張り付きを防止するためにvolatileは必要となる。

今回も似たようなもので、更新前のメモリの内容に依存しないので、
ワード境界に整列されたワード単位のメモリ転送命令がアトミックに
行われるかどうかを確認するだけで解決できるんじゃないの?

984 名前:983 mailto:sage [2006/09/09(土) 22:57:37 ]
ついでに、OS依存、アーキテクチャ依存だって言う必要もないのでは?
C言語から見たら、スレッドの存在そのものが環境依存なわけだし。

>IA-32 Intel® Architecture Software Developer's Manual,
>Volume 3A: System Programming Guide
>7.1.1 Guaranteed Atomic Operations

これを見ると、
>basic memory operations will always be carried out atomically
なわけで、少なくともワード境界に整列されたワード転送なら
アトミックに行われる事が保証されているように読めるのだが。

985 名前:デフォルトの名無しさん mailto:sage [2006/09/09(土) 23:17:13 ]
次スレ立ってる?

986 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:10:02 ]
立てるわ

987 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:20:09 ]
立てた

pc8.2ch.net/test/read.cgi/tech/1157814833/l50



988 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:29:26 ]
>>983
> という前提において、

そういう前提かどうかは明らかにされていない

>>984
> ついでに、OS依存、アーキテクチャ依存だって言う必要もないのでは?

「世に出回っている大抵のWindowsマシンでおかしくならない線」
というあいまいな線引きしかなされていない

つーかさ、
spec等から確認できることもせずに、いきなり検証コード持ち出して
「ホラ、動いてるから問題ないじゃん」
なんて言われてもさ、そのコード・やり方を信用する人っているのかね。

仮に確認できても、前提を考えれば、いかに狭い範囲でしか使えないかが
すぐに分かると思うんだが、それをしない理由はなんだろうね。

もう少しアタマ使えないかな。

989 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 00:36:28 ]
>>988
>spec等から確認できることもせずに、いきなり検証コード持ち出して
>「ホラ、動いてるから問題ないじゃん」
>なんて言われてもさ、そのコード・やり方を信用する人っているのかね。

悲しいけど現実にはかなり沢山いると思う
実際事故は多発してるでしょ?


990 名前:983 mailto:sage [2006/09/10(日) 01:08:03 ]
>>988

>「世に出回っている大抵のWindowsマシンでおかしくならない線」
>というあいまいな線引きしかなされていない

これが微妙な線引きだと言いたいのもわかるけど、
世の中のPC〜WSクラスでSMP/Multi Coreが可能なCPUの
大半はIA-32なアーキテクチャなんじゃないの?

>そういう前提かどうかは明らかにされていない

まず、>>923のコードではaから読み出した結果を利用して
aに再代入しているわけではないので、1.の前提は成り立つ。

で、「0x0000ffffか0xffff0000以外の数字が表示されるか」から、
aの更新が他のプロセッサに即時に伝搬される必要もないし、
どちらかの値になれば良くて、読み出し結果が0xffffffffの
ように混ざり合わなければいいだけなので、2.も成り立つ。

#とりあえず、初期値が延々表示される、、ってのは置いといて…。

少なくとも、今のところはこの考え方がまずい、
って証拠も誰も示していないんだよね。

991 名前:983 mailto:sage [2006/09/10(日) 01:23:24 ]
この辺のところはDCLみたいに覆されることもあるかもしれない。

で、DCLにも気になっているところがあって、

Singletonを保証するためのDCLは危険なのは解るんだけど、
100%のSingletonであることに依存しているわけではなくて、
運悪く初期化時に複数インスタンスが生成されてしまっても
許容できる状況でもDCLは使っちゃいけないのかな?

生成にそれなりに時間かかるからキャッシュ目的でSingletonに
してるけど、複数回生成されて違うオブジェクトを返そうが、
単なるキャッシュだから実害はないっていうような場合とかで。

992 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 01:26:06 ]
マルチスレッドを扱い続けて30年の漏れが断言するが、
>>923 のコードでは絶対に「0x0000ffff か 0xffff0000 以外の数字」は表示されない!












これで勘弁してもらえないか?

993 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 02:50:37 ]
CPUによる

994 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 03:03:58 ]
俺なんかマルチスレッドと暮らし始めて60年だぜ



995 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 03:56:28 ]
うめようよ

996 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 09:01:19 ]
2chを見続けて10年の俺が断言するが、
>>992の言うことに間違いはない!

997 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 09:06:40 ]
>>988
>なんて言われてもさ、そのコード・やり方を信用する人っているのかね。
顔が見えないのをいいことに、著しく礼儀を欠いた発言をする人間も信用できないが



998 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 09:16:58 ]
ヒント:2ch

999 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 09:57:14 ]
>>997
いるよ。
うちの新人はWebで調べたコードは絶対間違いないって言い張る。
そういえば、去年までいた中国人も同じ事いってたよ。

1000 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 10:14:33 ]
pthread_join( pc8.2ch.net/test/read.cgi/tech/1157814833/ , NULL);

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<278KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef