今日の投稿

もみ消されることがあるので、ここにもおいておくことにする。

http://indori.blog32.fc2.com/blog-entry-1003.html#cm

> 本当に読解能力がありませんね。
> 余りにも無理やりすぎて失笑しました
> 読解力なさすぎ。
 ええ、無理矢理でしょ。説明が下手すぎて「自然と読めない」から、無理矢理読むしかないのですよ。

> 並列処理を知らないまでも、カプセル化の原則を守っていればこんな設計ミスしません。
 だから、全体を通して、なぜ、「外部からアクセスできると仮定する」のか、わからない、と言っているのですが、まだわかりませんか?
 カプセル化の原則を守っていないから外部からアクセスできるのであれば、「設計ミス」なんですよ。それは、スレッドクリティカル以前の問題です。スレッドを使わなくても、バグの温床ですよね。だから、原則を知っている人は避けるでしょ。それでも「外部からアクセスできると仮定する」と書いてある。
何のためにこんなこと書いたんです?説明の仕方を設計していないから、読者を混乱させるのですよ。

> これは並列処理の一番基本的問題です。
> それを知らないとしか思えない。
 え〜っと、エイプリルフールのジョークですか?その、「一番基本問題」を説明するエントリではないのですか?タイトルには「並列処理で発生する落とし穴を回避せよ」と、書いてありますよ?で、それを説明するには、「説明が下手すぎ」といっているのですけど?
 それとも、「ローカル変数にしたからといって問題がなくなるわけではない」とか、「並列処理特有の問題ではない」に対して、「並列処理の一番基本的な問題を知らないとしか思えない」と仰ってます?
 インドリさんの場合、コメントが増えると、前に書いてあることと矛盾してくるんですよね。だから余計にわからなくなる。本文は、何を書きたかった(伝えたかった)のか。今、何を書いているのか。ちゃんと把握していますか?

 そうそう、CodeZineのコメントで気になったことがあるので、引用しますね。
> インドリ (2010/03/03 09:12):
> >スケジューラーの初期化について
> 並列処理では実行順序が保障されません。
> しかも、アセンブラレベルで命令が実行されております。
> その状態なのですから、初心者がTBBとネイティブスレッド・OpenMPなどの処理を併用させたときに、どのようなプログラムでも正しく実行できると100%の自信を持って言えるでしょうか?私はそんな危険を冒すよりも1行のプログラムを書く方を勧めます。
 面白いですよね。「アセンブラレベルで実行されている」と書いてあるのに、「1行のプログラムを書く方を勧めます」と。アセンブラを知っているなら、ソースコードの1行が1アセンブリではない事くらい、知っていますよね。それなのに、1行で書くことを勧めます、と。どうやったら辻褄が合うんでしょう?それとも、アセンブリレベルの「1行」で書けと?まさか、ね。
 どうも、理解できないのですよ。「c = 1; d = c;」と1行で書いたら、c と d への代入は他のスレッドから介入されないと仰ってます?それとも、cout に限ってます?まさか、「cout << 1 << 2 << 3;」と書いたら、他のスレッドの介入を受けないと?そんなはず無いですよね。「cout << 1」が basic_ostream<> を返すから、続けて「<< 2」と書けるだけ。つまり「*1.operator<<(2)).operator<<(3);」の、3回のメソッド呼び出しと同義だと、ご存知ですよね?「メソッドの呼び出しが1回だ」なんて、ましてや「1行だから1アセンブリだからスレッドセーフになるはずだ」なんて、仰らないですよね?!
 「アセンブラレベルで命令が実行」されると書かれているのに「1行のプログラムを書く方を勧める」と書いているのが矛盾しています。その上で、なぜ1行だと危険ではないのか、説明がなされていません。まったく、説明が下手すぎ。
 ん?まさか、初心者が、1つのプログラムの中で、TBB、OpenMP、ネイティブスレッド、pthreadなどを混在させると、どうなるかわからない・・・と仰ってます?いや、それ、誰もそんなこと言ってないし、飛躍しすぎだし。
 いやまぁ、それをいうと、この文節がどれにあてたのか、わからないんですよね。「スケジューラーの初期化」と、「1行のプログラムを書く」が、どうにも繋がらないんですよ。いったい、何の関係があるんだろう?


> このコードの断片を数十万行以上から見つけろと言っているのです。
> だから経験が必要になります。
 要りませんよ。コードを書く前に設計をしていれば、要りません。だから、初めてのマルチスレッドでも、失敗しなかったと書いていますよ。ああ、「レビューした」とは書いてなかったですね。済みません、レビューして、他の人に確認してもらうことも必要です。ちなみに、その「他の人」も、マルチスレッドは初めての経験でした。つまり、スレッド間でインスタンスを共有することによる危険を認識して、どうやって防ぐかという知識を持ち、適切に設計したので、「並列処理の一番基本的問題」は、未経験なのですよ。
 もっとも、設計の前にコードを書いたら、確かに経験が要りますね。それは認めます。が、そんなことしたら時間がもったいないので、勧められません。
 インドリさん、設計したことないんですか?そうか、コードを書いてから、そのコードによって考えに気づくのでしたね。コードが先ですね。聞くだけ野暮でした。失礼しました。
 でも、他の人に読んでもらう物を書くときは、ちゃんと設計してくださいね。

 そうそう、Objectさんもそうでしたが、「誤解している」というわりに、「どこを、どう、誤解しているか」の説明はないんですね。私はいったい、何を、誤解していると思っているのですか?私には、インドリさんこそ、並列処理の表面的なことだけを知って、知ったかぶりしているように見えるのですが。メモリリークとオーバーフローの件。番兵メソッドの件。StringCchCopyの件。ブロック化の件。値渡しと参照渡しの件。coutの件。とりあえず印象的だったのはこれだけですが、印象的な物だけでも1年ほどの間にこれだけあります。これだけの「間違い」を挽回するには、ちょっと「正しいことの実績」が、足りなくありませんか?<<<<<ここまで<<<<<

*1:cout.operator<<(1