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


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

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



1 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 17:19:27 ]
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その7
pc12.2ch.net/test/read.cgi/tech/1215253576/

■過去スレ
その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/
その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/

OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ
【OS】
【言語】
【実行環境】
【その他特記する事項】

577 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 22:22:30 ]
さむいな(´・ω・`)

578 名前:デフォルトの名無しさん mailto:sage [2011/01/28(金) 22:43:23 ]
寒稲

579 名前:デフォルトの名無しさん mailto:sage [2011/01/31(月) 22:10:29 ]
>>571
CPU使用率が100%じゃないロックなんて、スピンロックとは認めない。

580 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 00:53:40 ]
そもそも100%じゃないってことはコンテキストスイッチしてるってことになるでしょ?
何のためのスピンロックなのよあり得ない。


581 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 10:50:42 ]
スリープロックのループもスピン扱いすることもあるから何とも

582 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 19:37:25.20 ]
ちょっと聞いていい?

以下のコードでnotifyAllされたらどうなるのって質問

void A()
  synchronized(Lock){
    if(List.size() == 0){
      try{ Lock.wait(); }(Exception e){}
    }
    //以下処理続く
  }
}

このコードで複数のスレッドが待ち状態だったらnotifyAllとき再度Lockを取りに行ってくれるの?
もし、そうだったとしたら。
結局はnotifyで1つのスレッドのみ動かすってのと同じことになるの?

それとも再起処理的に以下のようにしなきゃだめ?
void A()
  synchronized(Lock){
    if(List.size() == 0){
      try{ Lock.wait(); }(Exception e){}
      A(); ←ここでさらに再帰的に同じメソッドを呼び出す
    }
    //以下処理続く
  }
}

おしえてエロイひと。。。

583 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 19:47:38.94 ]
>>582
notifyAll を呼ぶと、wait してたスレッドはすべて起きて、 Lock を取りに行く
どうせみんなすぐには取れないから Lock 待ち状態になるが、すでに wait からは外れてるので、 Lock を取れた順にすべてのスレッドが動き出す

notify の場合は、wait してたスレッドのうちひとつだけが起きて Lock を取りに行く
他のスレッドは、その後 Lock が空いても、眠ったまま起きない

wait はふつう再帰じゃなくて while にする
synchronized (Lock) {
 while (List.size() == 0) {
  Lock.wait();
 }
}
waitは、notifyされてなくても間違って起きることがあるらしいので、このように書くべきこととされている

584 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 20:17:38.60 ]
>notifyAll を呼ぶと、wait してたスレッドはすべて起きて、 Lock を取りに行く
ということはnotifyAllでそのまま下に処理が流れていくんじゃなくて

再度 synchronized(Lock){ ←この部分に処理が戻ってくるイメージなんですかね?

別のメソッド内の以下のようなコードでnotifyAllをかけようと思ってたんだけど、
ちゃんとnumの個数分以上のスレッドは再度、wait状態に入ってくれるのか心配でした
  for(int i = 0 ; i < num ; i++){
    List.add(object);
  }
  Lock.notifyAll();

それと。
 while (List.size() == 0) {
   Lock.wait();
 }
これしなきゃいけないんですね。Javadoc見てきました。

>>583 ありがとー。

585 名前:デフォルトの名無しさん mailto:sage [2011/04/04(月) 21:55:04.24 ]
>>584
synchronized のところまで戻るわけじゃなく、synchronized の中にいるまま、 wait のところで、
Lock をいったん解放、おやすみなサイして、起きたら元通りに取りにいく
wait は synchronized の中でありながら Lock を手放している特殊な場所

notifyAll を呼んだ側のスレッドは、notifyAll を呼んだあとそのまま下に流れていく
というのも、notifyAll を呼んだ時点では Lock は notifyAll 側のスレッドが握ってるので (synchronized 中のはず)、
wait 側のスレッドは起きるけれども、Lock を取れない
notifyAll 側が synchronized から抜けるなりして Lock を解放すると、wait 側が Lock を取って動き出せるようになる



586 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 01:36:55.92 ]
質問です
CreateThreadで複数のスレッドを作ったときに渡したパラメータは
スレッドごとに別々のものを渡してもいずれ同じものに書き換えられてしまうと思うんですけど
これをスレッドごとに別々のままにしてやるにはどうしたらいいのでしょうか
VCなら__declspec(thread)をつけるとTLSが使えると読んだのですが
これをCreateThreadに渡すThreadProcのどこで使えばいいのかわかりません

587 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 03:14:14.44 ]
>いずれ同じものに書き換えられてしまう
そういうことをやってるだけでしょ

588 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 08:33:13.11 ]
>>586
お前がやってんのは
int a;
int* b = &a;
int* c = &a;
int* d = &a;
のb,c,dが別々のものと言ってるのと同じだろ

589 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 08:38:22.51 ]
あーなるほど、同じ場所(=ポイント先)を渡して「別々のもの」と言い張っているのか。

590 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 11:41:30.98 ]
forkってスレッドセーフ?

591 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 11:56:15.17 ]
>>590
関数だけ見ればMT-safe
pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_09.html
でも
d.hatena.ne.jp/yupo5656/20040715

592 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 21:24:18.36 ]
別のポインタ渡したつもりで同じものを渡していたことに気づいて悲しくなりました
お手数おかけしました

593 名前:デフォルトの名無しさん [2011/06/23(木) 08:39:51.24 ]
スレッドって、毎秒ごとに数百回の開始と終了を繰り返すような使い方は正しいの?
それとも、必要な時だけスレを立てる使い方じゃなくて、
スレは基本的に立てっぱにしといて、用がある時にメッセージ等を送るという使い方をすべき?


594 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 08:45:48.47 ]
スレッドの開始はそれなりにコストの大きい処理だから
スレッドプールにするのが正解

595 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 08:49:17.54 ]
なるほど。直観的じゃないのな。



596 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 09:10:49.87 ]
用途によるよ。一度スレッドを起動したら数十秒は戻ってこないならプールしなくても大差ない。

597 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 09:47:04.06 ]
593の前提と変わってるじゃんか

598 名前:デフォルトの名無しさん mailto:sage [2011/06/23(木) 22:41:08.11 ]
>>593
同時に起動できるスレッドの数ってそんなに多くないしな。
32bit、Windowsだと2000個くらい(スタックサイズ標準の場合)

599 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 00:22:34.83 ]
スレッドの生成は5ミリ秒くらいのオーバーヘッドあるだろ。
数百回やるなんて頭おかしい

>>598
今時32ビット縛りなんて考える必要なくね?

600 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 05:23:53.79 ]
5msec!

601 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 10:49:09.11 ]
なにそのみずほ銀行

602 名前:デフォルトの名無しさん mailto:sage [2011/06/24(金) 10:53:32.07 ]
ミリ秒はつらいな・・・
と思ったけど16ビット機なら仕方ないか。

603 名前: ◆0uxK91AxII mailto:sage [2011/06/24(金) 17:27:33.68 ]
手元の環境だと、threadの生成と実行開始のどちらも0.1[ms]すら掛からないね:)

604 名前:デフォルトの名無しさん mailto:sage [2011/06/25(土) 01:58:06.76 ]
XPからスレッド生成が凄く速くなった記憶がある

605 名前:デフォルトの名無しさん mailto:sage [2011/06/25(土) 17:22:00.98 ]
じゃあ0.1msでスレッド生成するコード晒してみろよ



606 名前: ◆0uxK91AxII mailto:sage [2011/06/25(土) 18:39:30.70 ]
Win32のCRTにある_beginthread。
生成は0.1[ms]未満、実行開始はコンパイラかライブラリに依存で0.1[ms]台からに訂正。

#include <Windows.h>
#include <stdio.h>
#include <process.h>
struct perf {LARGE_INTEGER freq;LARGE_INTEGER t0;};void __cdecl thread(void *
pArg){perf *pperf;LARGE_INTEGER t1, d;QueryPerformanceCounter(&t1);pperf = (perf
*)pArg;printf("thread: %I64d\n",t1.QuadPart-pperf->t0.QuadPart);}int main(){
LARGE_INTEGER f={0}, t0, t1, d;perf perf;QueryPerformanceFrequency(&f);printf(
"freq: %I64d\n", f.QuadPart);perf.freq = f;QueryPerformanceCounter(&t0);perf.t0
= t0;_beginthread(thread, 0, &perf);QueryPerformanceCounter(&t1);printf(
"main: %I64d\n", t1.QuadPart-t0.QuadPart);Sleep(1000);return 0;}

607 名前:デフォルトの名無しさん mailto:sage [2011/06/25(土) 22:55:22.93 ]
>>606
5764ticks/272758=2.1ms。
一桁違ってないか?どんだけ速いマシン使ってんの

608 名前:607 mailto:sage [2011/06/25(土) 23:17:06.14 ]
訂正。
 誤:5764ticks/272758=2.1ms
 正:5764ticks/2727568=2.1ms

処理のスループットが問題なんだからJOINの時間も入れよーぜ。
あと、>>606はmainが先に終わると不正メモリアクセスになる糞コード

609 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 01:54:34.21 ]
C#だけど2マイクロ秒くらいだよ。
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (var i = 0; i < 1000; i++) {new Thread(F);}
decimal time = (decimal)sw.ElapsedTicks / System.Diagnostics.Stopwatch.Frequency;
Console.WriteLine("{0} [ms]", time / 1000 * 1000);

610 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 02:04:01.25 ]
            ∩_ 
           〈〈〈 ヽ
          〈⊃  }
   ∩___∩  |   |
   | ノ      ヽ !   !
  /  ●   ● |  /
  |    ( _●_)  ミ/ こいつ最高にアホ
 彡、   |∪|  /
/ __  ヽノ /
(___)   /

611 名前: ◆0uxK91AxII mailto:sage [2011/06/26(日) 10:35:46.17 ]
>>607 >>608
Core i7 2600K 3.4[GHz] HTT無効, Windows 7 X64 SP1, Visual C++ 2010 Express

>mainが先に終わると不正メモリアクセスになる糞コード
大丈夫だ、問題ない。

>>609
thread poolだから略。

612 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 15:21:14.56 ]
>mainが先に終わると不正メモリアクセスになる糞コード
こういうことを平気で書いちゃう人もいるんだな。笑える。

613 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 15:23:47.45 ]
具体的に反論できない奴のテンプレート的反応で笑える。

614 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 20:09:29.64 ]
>>611
Xeon E5506 2.13GHzだが0.46msだった。0.1msには及ばない。

>thread poolだから略。
Threadはスレッドプーリングされない。単にStartし忘れているだけ

615 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 22:10:05.48 ]
node.jsの説明見ているとシングルスレッドなので万歳!みたいな記事が多く混乱してみる



616 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 23:27:19.63 ]
あれは

『マルチスレッドやマルチプロセスではC10Kに対応できなくね?
俺良い事思い付いた。シングルスレッドでイベントドリブンにしたら良いんじゃね。』

という発想だから、

『あー、でもマルチコアマシンではシングルスレッドだと性能出なくね?
結局ロードバランサとか必須だわな。』

みたいな話をすると、そもそも何でマルチスレッドを否定していたのかという
自己矛盾に陥るので、わざとスルーしているのかもね。ちょっと分かり辛いよね。

617 名前:デフォルトの名無しさん mailto:sage [2011/06/26(日) 23:49:28.20 ]
C10Kが騒がれてたのはもう10年くらい前の話で、
その頃は1CPUでシングルコアのマシンが殆どだったしね

618 名前:58-3-155-112.ppp.bbiq.jp mailto:sage [2011/06/27(月) 07:39:41.06 ]
リクエスト来る事にスレッド作成してた今までが異常すぎ
C10K問題で破綻するのは今でも一緒ですわい

619 名前: ◆0uxK91AxII mailto:sage [2011/06/27(月) 09:16:36.96 ]
>>614
>Threadはスレッドプーリングされない。単にStartし忘れているだけ
ouch
C#、試してみたら遅すぎた。
Cの4~20倍くらい掛かっている。

620 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 19:42:02.22 ]
>遅すぎた
0.1msの20倍は2msだろ。
50スレッド生成しても0.1秒、全く問題ないような

621 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 20:02:07.59 ]
Unix屋なんでWindowsは全く詳しくないけど
スレッド数をむやみやたらを増やしてもオーバーヘッドが多くなるだけでいいことなんてないのでは?
それよりスレッドプールを使った方が管理も簡単だと思うんだけど、Winの開発環境にはもしかしたら
スレッドプールライブラリーみたいなのがなくて自分で仕組みを作らなきゃ駄目なのかい

622 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 20:04:40.67 ]
スレッドは設計?をよう考えないとハマるだろうに

623 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 21:44:24.18 ]
>>621
UNIXでよく使われるものはWindowsにもある

と考えてまず間違いない

624 名前:デフォルトの名無しさん mailto:sage [2011/06/27(月) 23:29:57.24 ]
スレッドのメリットはスループット性能だけではないのだが。

625 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 10:33:59.70 ]
メモリ空間が共通なのはデメリットだよね?



626 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 11:04:08.15 ]
共通じゃないのが欲しければfork→execでいいんじゃね。

627 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:31:14.09 ]
メモリ空間共通のデメリットって、Cでメモリ破壊の危険性を排除できない
ぐらいしか思いつかないんだが。

628 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:40:04.57 ]
・メモリ共有だと、プロセスが落ちたら皆落ちる
・NUMAではメモリ上のデータは分散していた方が良いよね?
・別プロセスなら別ノードにも移せるので自由度が高い
・セキュリティ(他の実行単位からデータが見えない)

等々

629 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:43:17.24 ]
仕事で4Gの空間じゃ足りないってことがあった
64bitならしらねw

630 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 20:55:56.81 ]
NUMAは違うだろ
どこから割り当てるかは別にプロセス分けなくてもできる

631 名前:デフォルトの名無しさん mailto:sage [2011/06/28(火) 21:36:49.16 ]
メモリ空間が共通なのはメリットだろう常考

632 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 10:48:43.16 ]
プログラムは常に死ぬ可能性がある という前提に立つと、
メモリ空間の共有はデメリットだよな


633 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 11:36:26.30 ]
メリットもデメリットもある

634 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 11:51:59.86 ]
>>632
>プログラムは常に死ぬ可能性がある という前提に立つと、
なんという時代遅れのやつ

635 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 12:05:00.86 ]
スレッド蹴るかプロセス上げるかは、利用場面での損得勘定で決まることだから、
状況想定もなしにメリットデメリットを語ってもナンセンスすぎてなあ…



636 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 12:54:18.84 ]
>>635
マルチスレッドで得られるメリットは基本的にパフォーマンスのみ。
マルチプロセスで得られるメリットはマルチスレッドで実現不能なことがほとんど。

637 名前:デフォルトの名無しさん mailto:sage [2011/06/29(水) 16:52:22.47 ]
ある特徴が長所なのか短所なのかは目的次第(この話に限らない一般論)

パフォーマンスいらないならマルチスレッドなんてしないだろ

638 名前:デフォルトの名無しさん mailto:sage [2011/07/23(土) 20:17:54.60 ]
処理中にUIが固まらないようにするためのマルチスレッドは
よく使用されるが、それをパフォーマンス目的とは言わないだろう

639 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 16:21:14.65 ]
パフォーマンスだけがメリットだとしても、パフォーマンスのメリットは計り知れない
からな
クラしか見てない奴はパフォーマンス需要は頭打ちと思ってるかもしれんが、鯖は逆に
クラウド化でクラの負担も全部引き受ける路線だから、パフォーマンスが非常に厳しく
求められるようになってる訳だし、鯖向けソフトウェアはパフォーマンス一つでシェア
が取れる例も全く珍しくないしな

640 名前:デフォルトの名無しさん mailto:sage [2011/08/02(火) 16:23:33.58 ]
×クラウド化で
○クラウド化とか含めて

641 名前:デフォルトの名無しさん mailto:sage [2011/08/14(日) 09:56:51.34 ]
>>638
例が適切ではアリマセンネー
UIを固めない = 操作者を待たせない = 操作者も含めたシステム全体のパフォーマンス向上、
という図式が成立するとも言う

パフォーマンス向上以外のマルチスレッド利用としては、
非同期事象を取りこぼさずに受けるため、というのが挙げられると思うが、
それとて取りこぼさずに済むためのハードウェアの速度要件もしくはCPU時間消費の低減につながるため
結果的にパフォーマンス向上と言えなくもないという、

642 名前:デフォルトの名無しさん mailto:sage [2011/08/14(日) 12:36:09.51 ]
msdn.microsoft.com/library/cc464185.aspx
これでおk

643 名前:デフォルトの名無しさん mailto:sage [2011/08/14(日) 13:42:20.18 ]
>>641
副次的な効果を目的に持ってこないほうがいい。
UIを固めないと中断が実現できたり、操作者のわかりやすさに繋がるんだよ。
それはパフォーマンス向上ではなく、別のことが目的だろう。

644 名前:デフォルトの名無しさん [2011/08/14(日) 13:58:19.75 ]
>>643
例えばIDEがエディタを固まらせないでバックグラウンドでソースを解析するのは
>操作者も含めたシステム全体のパフォーマンス向上、
になるんじゃないの?

645 名前:デフォルトの名無しさん mailto:sage [2011/08/15(月) 02:52:00.24 ]
>>644
よく読めよ。
>>638が噛みついたのは「処理スレッドをUIと別にするのがパフォーマンス目的か?」
じゃなくて、
「マルチスレッドは必ずパフォーマンスが目的と言えるのか?」だろ。んなこたーない



646 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 12:42:20.68 ]
>UIを固めないと中断が実現できたり、操作者のわかりやすさに繋がるんだよ。
これをパフォーマンス向上と言ってもおかしくない
dic.yahoo.co.jp/dsearch?p=performance&dtype=1

647 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 18:54:09.83 ]
>>646
どこを読めば良いのでしょうか

648 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 19:21:06.24 ]
うーん・・
ことプログラミングの文脈に関する限りはユーザーリスポンシビリティやユーザーエクスペリエンス
はパフォーマンスの一部と解釈することはあまり無いんじゃないかな?


649 名前:デフォルトの名無しさん mailto:sage [2011/08/17(水) 20:51:02.93 ]
>>646
おかしい

650 名前:デフォルトの名無しさん mailto:sage [2011/08/21(日) 09:04:32.75 ]
「パフォーマンスの向上」が何を意味するのか、が決まらないと無意味な議論だな
その点に限れば、主観以外の論拠が出てこない(実際出てない)から、終着点なんか
無いぞ
元々MTのメリットという話題だったが、技術的に何の参考にもならん話だしどうでも
いいんだが

651 名前: ◆0uxK91AxII mailto:sage [2011/08/21(日) 11:45:37.53 ]
意味を定義しても無駄な議論だけどね:b

652 名前:デフォルトの名無しさん [2011/09/09(金) 19:42:55.52 ]
C#のマルチスレッドのプログラミングです。

変数がいくつかある。例えばこんな感じ。
int A;
int B;


int Z;
で、スレッド@で定期的にA〜Zの変数の値を更新している。

スレッドAからこれら変数を読みたいのだが、必ずA〜Zまで全部更新された状態で読みたい。
(つまりスレ@が更新処理中に読みに行くのはアウトってこと。)

優先度が高いのはスレ@です。

どうやれば“スマート”なんでしょう?
変数を更新している間スレ@以外の実行を止めるような仕掛けがあるんじゃないかと思って探したんだけど無さそうだね。

653 名前:デフォルトの名無しさん mailto:sage [2011/09/09(金) 19:50:28.24 ]
ttp://ufcpp.net/study/csharp/sp_thread.html

654 名前:デフォルトの名無しさん [2011/09/09(金) 20:10:35.64 ]
>>653
それ、なんかちゃうで。

655 名前:デフォルトの名無しさん mailto:sage [2011/09/09(金) 21:29:06.03 ]
>>652
途中で読まれてはいけない更新の開始から最後までロックする。
ロックが長時間にわたる可能性がある場合はSystem.Threading.Mutex.WaitOneで
タイムアウトさせる。



656 名前:デフォルトの名無しさん mailto:sage [2011/09/09(金) 21:57:27.33 ]
1以外は読むだけなんだろ?
そりゃ System.Threading.ReaderWriterLock だろ

657 名前:デフォルトの名無しさん [2011/09/12(月) 00:26:16.03 ]
中途半端な状態で読むのがアウトってだけだったら、一つのクラスにA〜Zの変数をまとめておいて
更新時には丸ごと新しいインスタンスに差し替えてしまえばロックいらないよ

658 名前:デフォルトの名無しさん mailto:sage [2011/09/13(火) 18:08:55.63 ]
RCUのめんどいところは古い情報をいつ削除するか

659 名前:デフォルトの名無しさん mailto:sage [2011/09/14(水) 18:37:15.35 ]
C#での話だからGC任せでok
あと、インスタンスへの参照を保持する変数にはvolatileを付けとけよ。

660 名前:デフォルトの名無しさん mailto:sage [2011/09/14(水) 21:28:32.04 ]
この使い方だと実はつけなくても大丈夫だけどな。
つけとく方がいいけど。


661 名前:デフォルトの名無しさん mailto:sage [2011/09/14(水) 22:13:31.15 ]
クライアントが古い方への参照を持ち続けていてはまると予想。

662 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 00:00:30.87 ]
>661 の他にも、「新インスタンス上の変数AZへの書き込み」と
「共有変数を新インスタンスへの参照で更新」がリオーダーされないようにする必要がある。

663 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 00:24:43.65 ]
.NET Framework 2.0以降(CLR2.0以降)のメモリモデルでは、
書き込み順をリオーダできないというルールがあるため、それは起こらない。


664 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 02:03:26.35 ]
>>663
一般の変数に関しては、そんな規定は仕様書の何処にもない。

665 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 02:49:09.91 ]
は?




666 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 08:20:18.11 ]
コンパイラが順序通りに書き込んでもCPUがそのように
振る舞うわけねーだろ

667 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 08:23:43.17 ]
メモリモデルの意味も分かってない馬鹿ばかり。

668 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 08:45:27.59 ]
>>666
お前はMSの文書ちゃんと読めよ

669 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 09:34:15.77 ]
ちなみに読み込みは順序換えが許されている。
一般的には読み込み順序の問題でvolatileが必要になるんだが、
今回のような処理では、参照変数より先に参照先を読むことが不可能なため、
volatileがなくても実は問題が発生しない。
もちろん読み込みの挿入が許可されてないってのも重要なんだが。

まあ普通はvolatileつけるでOK。


670 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 10:44:40.93 ]
>>669
いや、だから読み書きともに順序替えが許されてるんだってば

671 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:08:07.18 ]
>>669
つけなくて大丈夫ってことは無いよ
なにか別のパターンと勘違いしてないか?

672 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:27:46.91 ]
つけなきゃだめってのは、何を見て言ってるの?
CLR2.0のメモリモデルでは書き込み順序換えは許可されてない、
かつ読み込みを複数回に分ける事も許可されてない、
したがって今回のような処理では実質的にvolatileは不要。

このことはMSDNマガジンにも書かれてる内容。


673 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:28:52.30 ]
>>670
書き込み順序換えは出来ないとはっきり書かれてる。


674 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 11:59:15.21 ]
>>673
どこに?
CLIの仕様書にはどこにもそんなことは書かれてないが。

675 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:01:40.73 ]
>>672
それはあんたがMSDNの記事を誤読してるだけだろ。



676 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:08:07.35 ]
>>674
だから最初からCLR2のメモリモデルではと言っとろうに

677 名前:デフォルトの名無しさん mailto:sage [2011/09/15(木) 12:13:29.95 ]
>>675
どこを誤読してるのか明確に指摘してくれ。

ttp://msdn.microsoft.com/ja-jp/magazine/ee532386.aspx
正確には全く同じ話ではないが、結論は同じことになる話が出てる。
まあMSDNマガジンの例の方がより無茶な話も出てるけど。







[ 続きを読む ] / [ 携帯版 ]

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

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