5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:04/10/20 19:28:57
マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。

その1 http://pc3.2ch.net/test/read.cgi/tech/997345868/
その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/

2 :デフォルトの名無しさん:04/10/20 19:29:21
関連モノ

pthread地獄
http://pc5.2ch.net/test/read.cgi/unix/1010933537/l50

Pthread -- POSIX Thread Mailing List
http://www.media.osaka-cu.ac.jp/mailman/listinfo/pthread

3 :デフォルトの名無しさん:04/10/20 20:19:45
Pthread関係

The Single UNIX Specification, Version 2 Threads Extensions
http://www.unix.org/version2/whatsnew/login_threads.html

Multithreading in the Solaris Operating Environment
http://wwws.sun.com/software/whitepapers/solaris9/multithread.pdf

Building an open-source Solaris-compatible threads library
http://www.opensource.hp.com/the_source/linux_papers/scl_solaris.htm

Pthread Support in Microsoft Windows Services for UNIX Version 3.5
http://www.microsoft.com/technet/itsolutions/interop/sfu/pthreads0.mspx

Programming with POSIX Threads
http://www.awprofessional.com/title/0201633922

4 :デフォルトの名無しさん:04/10/20 20:21:31
ダグ・リー「Javaスレッド・プログラミング
並列オブジェクト指向プログラミングの設計原理」
http://www.amazon.co.jp/exec/obidos/ASIN/4881359185/

5 :デフォルトの名無しさん:04/10/21 13:08:21
>>1
誌ね

6 :デフォルトの名無しさん:04/10/21 13:16:00
>>1
糞スレ乙

7 :デフォルトの名無しさん:04/10/25 04:49:17
ほすしてみよう
ネタ щ(゚▽゚щ) カモーン

8 :デフォルトの名無しさん:04/10/25 10:10:28
FairThread最強伝説

9 :デフォルトの名無しさん:04/10/25 18:51:19
Win32のスレッドでGDIオブジェクトをスレッド間で共有して
ロックせずに交互に描画なんかしたりしたらまずいよね?
なんかWeb上にそういうサンプル使って説明してる馬鹿がいたからびっくりした


10 :デフォルトの名無しさん:04/10/25 21:14:29
>>9
...

11 :デフォルトの名無しさん:04/10/25 21:42:21
>>9
どこのページ?


12 :デフォルトの名無しさん:04/10/25 22:32:19
はっ、漏れのHPだw

13 :デフォルトの名無しさん:04/10/26 10:35:16
デッドロック以外にスローダウンというのがあって、こいつを回避するのは
なかなか難しいね。頭痛いわ。

14 :デフォルトの名無しさん:04/10/26 15:21:56
>>13
スローダウンってなんですか?

15 :デフォルトの名無しさん:04/10/26 21:50:29
確かに微妙な表現だよねw

16 :デフォルトの名無しさん:04/10/27 23:17:12
>>12
早く直せよ

17 :デフォルトの名無しさん:04/10/28 20:31:50
>>9
この辺か?
ttp://wisdom.sakura.ne.jp/system/winapi/win32/win144.html

18 :デフォルトの名無しさん:04/10/28 21:47:23
そのサイトは初心者スレで馬鹿にされたサイトだな

19 :デフォルトの名無しさん:04/10/30 04:23:22
>>14
スローダウンぐらいぐぐれよ(((;-д- )
ttp://msugai.fc2web.com/java/thread/deadLock.html
システムプログラミングの本には大抵症状を起こすプログラム例がのっている。

20 :デフォルトの名無しさん:04/10/31 00:37:13
要するにスレッドの実行より切り替えに時間がかかって本末転倒状態になってるのがスローダウン?

21 :デフォルトの名無しさん:04/10/31 01:07:15
>>19
べつにyahooでいいじゃん

22 :デフォルトの名無しさん:04/10/31 07:37:24
>>20
全然違う。内部でミニデッドロックが多発して、本来走っているべき
スレッドの数が大幅に少なくなっているのがスローダウン。止まらず
に動いているので一見正常に見えるが、処理速度が遅くなるので、
あちこちに不都合が出る。最終的に完全なデッドロックに移行してしまう
事もある。

設計ミスが原因。

23 :デフォルトの名無しさん:04/10/31 11:17:12
ミニデッドロックって何だよ(w

ジャインアントロックすると簡単に起きるよね。

24 :デフォルトの名無しさん:04/10/31 11:37:02
スーパーデッドロックとかウルトラデッドロックはもっとデッドロックだぞ。

25 :デフォルトの名無しさん:04/10/31 12:18:59
デッドロックにミニもビッグもないだろ。バカ?

26 :デフォルトの名無しさん:04/10/31 15:32:31
ttp://d.hatena.ne.jp/k-waki/20041029#p2

27 :デフォルトの名無しさん:04/10/31 16:01:46
マルチスレッドとか言っても
管理に手間かかってメモリ余計に食うだけだろ

普通に処理したほうが百倍早い

28 :デフォルトの名無しさん:04/10/31 16:03:00
>>27
レベルの低い方はお引き取りください

29 :デフォルトの名無しさん:04/10/31 16:03:48
>>27
たいていそうだよね (百倍速いってことはないけど)。
できるだけ避けるほうがいいと思うよ、マルチスレッド。

30 :デフォルトの名無しさん:04/10/31 16:08:37
>>12
なおしたのか?

31 :デフォルトの名無しさん:04/10/31 16:12:22
>>29
HT


32 :名無しさん@お腹いっぱい。:04/10/31 16:49:20
スーパーとかウルトラとか百倍とか、漫画みたいだな。

33 :デフォルトの名無しさん:04/10/31 17:22:28
>>22
>>19のリンク先との説明と全然ちがうのですが、どっちが正しいの?

34 :デフォルトの名無しさん:04/10/31 18:02:23
>>30
まだです

35 :デフォルトの名無しさん:04/10/31 18:31:21
>>33
>>19のリンク先の説明は舌足らず。ちゃんとした本を買って勉強した方がいい。

36 :デフォルトの名無しさん:04/10/31 18:44:02
>>22
>内部でミニデッドロックが多発して

それは普通にデッドロックって言わない?

37 :デフォルトの名無しさん:04/10/31 18:44:53
>>34
さっさと直せよ

38 :デフォルトの名無しさん:04/10/31 19:08:52
FTPのパスワード忘れたので、無理です。

39 :デフォルトの名無しさん:04/10/31 20:18:58
ネタですか?

40 :デフォルトの名無しさん:04/10/31 23:06:38
ネタです。

41 :デフォルトの名無しさん:04/10/31 23:29:46
もう寝たです。

42 :デフォルトの名無しさん:04/11/01 03:34:01
スローダウンの他にスタベーションってのがあるから、>>22の場合は
それに相当すると思う。またレース状態ってのもある。

ttp://www.microsoft.com/japan/msdn/vs/general/vbtchusingthreads.asp

43 :デフォルトの名無しさん:04/11/01 04:58:11
すたべは、機会は与えられているのに、
リソースを割り当てられないエンエィティがあること。

レース状態というのは、
単にリソースを奪い合う関係にある状態のこと。

44 :デフォルトの名無しさん:04/11/01 07:53:18
スローダウンの他にマスタベーションってのがあるから、

45 :デフォルトの名無しさん:04/11/01 08:55:55
>>44
誰かが言うと思ってた。本当にバカなんだから。

46 :デフォルトの名無しさん:04/11/02 13:37:01
遅漏ダウンの他に

47 :デフォルトの名無しさん:04/11/03 16:56:43
pthreadで、スレッドが現在動いているかどうか調べるにはどうすればいいんですか?

48 :デフォルトの名無しさん:04/11/03 17:11:41
Cで書いてるのだが、なかなかうまくいかない。
以下のようなプログラムを作ってる。
懸賞サイトをよく利用するので住所などの入力を自動にするプログラム。
配布されてるのはあるが、なんか使いにくく機能がいまいち。
サイトごとに指定できないので、入力がおかしくなる懸賞サイトがある。

49 :デフォルトの名無しさん:04/11/03 17:32:00
>>48
スレ違い。

50 :デフォルトの名無しさん:04/11/03 23:59:16
>>47
「現在動いている」とは?

51 :デフォルトの名無しさん:04/11/04 06:15:00
gccでMPIを使えるようにするにはどのようにしたらよいのでしょうか?

52 :デフォルトの名無しさん:04/11/04 10:56:52
MPIはスレ違い。
使えるようにするだけなら、MPIの実装をinstallしろ。それだけだ。

53 :デフォルトの名無しさん:04/11/04 22:26:16
rand()がスレッドセーフではないのは何故ですか?

54 :デフォルトの名無しさん:04/11/04 22:29:45
めんどいから

55 :デフォルトの名無しさん:04/11/05 01:51:03
boost::randomはスレッドセーフじゃなかったっけ?

56 :デフォルトの名無しさん:04/11/10 20:37:20
Win2003 Server以上でMemoryBarrierというキャッシュのフラッシュのマクロがあるのだが、
それ未満のOS(マルチCPUやHyperThreadingなども含めて)ではスレッドの切り替え時には、
同期制御をして書き換えた部分も切り替え後に値が途中までしか変わっていない
ということが有り得るのでしょうか?

通常、小さい変数などはvolatileをつけるべきだってのは知っているのですが、
const_castでvolatileを変える仕様はMS VC7.1には入っていないし、
同期をかけるクラスはすべてvolatile版も作れということですかねぇ。


57 :デフォルトの名無しさん:04/11/10 21:21:42
>>56
前スレ読め。

58 :デフォルトの名無しさん:04/11/10 22:04:14
DAT落ちなんですが。
その1にもありますかね?その1読み中。


59 :デフォルトの名無しさん:04/11/10 22:14:38
にくちゃんねるで拾えば読めるよ

60 :56:04/11/10 23:22:11
にくちゃんねるでその2だけひっかからず。mimizなんたらも見えず。
その1をよんだところ、マルチスレッドな環境で同期処理用の関数で
制御を行うときにはキャッシュはクリアしていなければ、まともに動作しねぇ。
マルチプロセスじゃ弱いメモリモデルというのになってるらしい。
本でもあさってみますわ

61 :デフォルトの名無しさん:04/11/10 23:47:02
> MemoryBarrierというキャッシュのフラッシュ
微妙に誤認がある。やはりその2嫁


62 :デフォルトの名無しさん:04/11/10 23:57:59
>>58
googleのキャッシュとか、archive.orgとか。

63 :56:04/11/11 06:51:00
google cacheでその2(900ちょい前迄)よんだが、流れがつかみにくい・・・
VC++な俺は_ReadWriteBarrierでreorderされないようにバリアしろ。
Intrinsicな_Interlocked*をつかって、reorderも抑制しろ。
ソース書き直す前に、手持ちの本も読んでみます。

64 :デフォルトの名無しさん:04/11/13 17:54:55
上手いスレッドレイプのやり方教えてくらさい。

65 :デフォルトの名無しさん:04/11/13 18:39:17
>>64
君には無理です。氏になさい。

66 :デフォルトの名無しさん:04/11/13 19:42:36
>>64-65
ここでスレイプの練習するの止めてくれる?
自作自演で煽り煽られの状態に持ち込むのがテクニックの一つだよね?

67 :デフォルトの名無しさん:04/11/17 14:43:47
Solarisのマルチスレッドプログラムをlinuxに移植しることになったんだけど、
なんか参考になるサイト教えてくださいおながいします。

68 :67:04/11/17 15:19:35
linuxのThreadライブラリには何種類かあると思うのですがpthreadが無難なんでしょうか?

69 :デフォルトの名無しさん:04/11/17 15:49:25
>>68
pthreadが無難だと思う

70 :デフォルトの名無しさん:04/11/17 22:35:10
なんでオライリーのpthread本はイモムシの表紙なんですか?
気持ち悪いです。

71 :デフォルトの名無しさん:04/11/17 23:01:38
重複スレ立てて並列実行しなくていいの?

72 :デフォルトの名無しさん:04/11/17 23:19:02
スレの立て方の覚えたての時期は
得意げになってクソスレ立てまくるんだよな
これ、マジでシャレにならんよ

73 :デフォルトの名無しさん:04/11/18 01:49:27
>>67
kernelのversionは新しくしてね。
古いlinuxthreadは糞だから。pthread互換じゃないから。

74 :デフォルトの名無しさん:04/11/22 15:04:29


75 :デフォルトの名無しさん:04/11/23 20:50:21
マルチスレッド プログラムの動作をうまく視覚化するような図法ってあるのでしょうか?
何かありましたらお教えください。お願い致します。

76 :デフォルトの名無しさん:04/11/23 21:59:08
そういうデバッガはある。

77 :デフォルトの名無しさん:04/11/24 00:03:04
Java言語で学ぶデザインパターン入門 マルチスレッド編にちょっと図があるけど、
Javaの範囲(モニタ)に特化してるかも。とするとpthreadだと使いにくそうな気がする。
組み込み系の本に載ってるかも…でもスレッドじゃなくて全体が並列に動くからなあ。


78 :デフォルトの名無しさん:04/11/24 00:12:22
>>75
UML
昔はペトリネット

79 :デフォルトの名無しさん:04/11/25 11:19:50
現在複数スレッドから共有するメモリにアクセスしたいのですが
メモリにアクセスする時にクリティカルセクションで同期をとっています。
クリティカルセクションEnter状態の時に、子関数を呼んだ場合
子関数が動作中も安全なのでしょうか。
Thread()
{
  EnterCriticalSection();
  Func();
  LeaveCriticalSection();
}

Func()
{
  共有するメモリの編集処理
}

80 :デフォルトの名無しさん:04/11/25 11:33:43
>>79
安全なのです

81 :79:04/11/25 12:02:06
>>80
回答ありがとうございました。

82 :デフォルトの名無しさん:04/11/25 18:57:55
マルチスレッドってそもそもまに?

83 :デフォルトの名無しさん:04/11/25 19:12:55
一つの掲示板にスレッドがいくつも立てられること

84 :デフォルトの名無しさん:04/11/28 22:45:24
>>79
他スレッドはEnterCriticalSection()から返ってこない。
動作を見れば簡単にわかるだろうに・・・。

85 :デフォルトの名無しさん:04/11/29 05:20:34
pthreadで優先度を変えてスレッドを実行するにはどうしたらよいのでしょうか?

86 :デフォルトの名無しさん:04/11/29 11:58:07
>>85
pthread_setschedparam()


87 :デフォルトの名無しさん:04/11/30 01:53:04
ネーミングセンスを疑う>pthread_〜

88 :デフォルトの名無しさん:04/12/09 22:28:24
Linuxで、pthreadを用いたマルチスレッドプログラムを作っています。
pthread_cond_wait関数を用いて待機させ、
pthread_cond_signalやpthread_cond_broadcast関数を用いて
待機スレッドを起こしています。

ここで質問ですが、
ある時点において、待機中のスレッドがあるかどうか、
できればいくつあるのか、を拾う術はあるのでしょうか。
ある待機中のスレッドをpthread_cond_signal関数で起こした際に、
他に待機中のスレッドがあるかどうかで処理を変えたいと思っています。

以上、よろしくお願いします。

89 :デフォルトの名無しさん:04/12/09 23:08:15
OpenGLでパーティクルとばしたいのだがどうすればよいのでしょう?

90 :デフォルトの名無しさん:04/12/10 07:34:19
>>88
pthread_*にはないので、その辺のロジックは自分で書く。

91 :デフォルトの名無しさん:04/12/10 22:44:35
C言語(Solaris)でマルチスレッド初心者向けの本が欲しいのですが、お勧めを教えて下さい。

92 :デフォルトの名無しさん:04/12/11 00:46:32
英語ならテンプレにあるよ。

93 :デフォルトの名無しさん:04/12/11 01:01:26
ありがとうございます。でも、出来れば日本語がいいんですけど・・・

94 :デフォルトの名無しさん:04/12/11 04:53:27
http://www.amazon.co.jp/exec/obidos/ASIN/4756117848/qid=1102708104/sr=1-2/ref=sr_1_10_2/249-8517280-2920313
http://www.amazon.co.jp/exec/obidos/ASIN/4756116825/qid=1102708104/sr=1-3/ref=sr_1_10_3/249-8517280-2920313
下のは持ってるが、ソラリスマンセーでいかにソラリスが素晴らしいか
嫌というほど延々と語っている本だ。訳文は悲惨だし、カナーリ古い内容なので
お勧めはしないけど。どこに住んでるんだ?
都内なら、神保町の三省堂本店に二冊ともあったよ。


95 :デフォルトの名無しさん:04/12/11 08:40:51
両方ともいい本だ。こういうしっかりした内容のスレッド本は珍しい。
前の本は古いSolairs独自のスレッドAPI。しかし解説が良い。
初心者向けのスレッド概念、マルチスレッド技法から説き明かしてある。

Solarisは8辺りからスレッド内部が結構変っているから、
細かい制御をしたい人は、>>3のSunのPDFを。

96 :デフォルトの名無しさん:04/12/11 16:26:49
fiberってWinMeじゃ動かんの?

97 :69式フリーPG ◆hND3Lufios :04/12/11 16:49:01
CreateFiberは98/Meも使えるようだけど。

98 :デフォルトの名無しさん:04/12/11 17:06:31
>>97
ありがd

あちこち調べまわった結果、95以外は一応大丈夫みたいですのう。

でもfiber関連はドキュメント見ると
>  Windows NT: 3.51 SP3 以降を使います。
>  Windows: サポートされていません。
と書いてあるのが激しく不安

99 :デフォルトの名無しさん:04/12/11 20:29:28
>>98
Microsoft Platform SDK February 2003から
Client: Included in Windows XP, Windows 2000 Professional, Windows NT Workstation 3.51 SP3 and later, Windows Me, and Windows 98.


100 :91:04/12/11 21:40:45
>>94
ありがとうございます。今日、神保町で買ってきました。
三省堂には、なかったので書泉グランデで。

101 :デフォルトの名無しさん:04/12/12 01:49:01
>>88
診断(デバッグ)目的なら、必要な状況は理解できるが

それ以外だとちょっと用途が浮かばない。
だいたい、調べた次の瞬間、待機中のスレッドが待機中かどうかわからんし。

sem_getvalue( )なんかも同じだけどね。
セマフォ値を得たところで、その値を使うころに
値がどうなっているのかわからん。


102 :デフォルトの名無しさん:04/12/12 02:56:02
>>51
MPICHを入れようね。
SSHかRSHを使えるようにしてね。
複数のコンピュータ上にNFSで同じディレクトリを用意しておいてね。
mpicc hoge.c
mpirun a.out
で実行できるよ。

103 :デフォルトの名無しさん:04/12/12 10:24:19
>>90
わかりました。
がんがります。

>>101
まさにその通りで、デバッグ用に使おうと思ってました。
printkでどう表示するか、を分けようと・・・。
仰っている懸念は、設計上回避しているつもりではいます。
一旦あるスレッドがpthread_cond_signalで起こされると、
起こされたスレッドでの処理が終わるまではpthread_cond_signalは
呼ばれないようにはしています。
逆に待機スレッドが増えるという可能性はありますが、待機スレッドが
0か0以外かさえわかればいいので無問題です。
というわけでセマフォを使うことにします。
ありがとうございました。

104 :デフォルトの名無しさん:04/12/12 11:09:01
>>103
表示だけならどうと言うことは無いけど...。

> 一旦あるスレッドがpthread_cond_signalで起こされると、
> 起こされたスレッドでの処理が終わるまではpthread_cond_signalは
> 呼ばれないようにはしています。

スレッドの処理の終了と pthread_cond_signal を呼び出す処理の競合のあたりちと心配。

105 :デフォルトの名無しさん:04/12/12 19:56:20
pthreadで、あるスレッドが動いているかどうかを調べるにはどうしたらいいのでしょうか。
pthread_createで得られるptherad_tを使って判定する関数がありそうなのですが、
調べたところ見つかりませんでした。

106 :デフォルトの名無しさん:04/12/12 20:03:01
しかし、そんな難しい使い方しなくてもCSP的な簡単な使い方だけですます
のではだめなの?何も複雑にすることないじゃん。

107 :105:04/12/12 20:56:07
自己解決です。
1.動いているかどうか判定する変数を用意する。
2.pthread_create()の直前にtrueにする。
3.pthread_create()で設定したデストラクタでfalseにする。

108 :デフォルトの名無しさん:04/12/13 00:11:08
>>107
テストした瞬間、どうなっているかわからんがな。

109 :デフォルトの名無しさん:04/12/13 22:03:59
>>107 勝手に自己解決するな!

質問の意味がさっぱりわからん。
pthread_tがあるってことは、それすなわちthreadじゃないのか?
「スレッドが動いている」って何?


110 :デフォルトの名無しさん:04/12/13 23:55:05
読む気力がないので誰か要約して(w
http://lists.debian.org/debian-devel/2003/04/msg02112.html

111 :デフォルトの名無しさん:04/12/14 00:47:14
犬板で聞けば?

ざっと読んだところ。

主張
・正式な意味でのi386サポートをやめたい

理由
・gcc3.2以降はi386をサポートしていない(i386では動作しない)
・i486以降に限定すれば、速度の面でかなり有利。カーネルも、ユーザアプリも。
・i386とi486以降を個別にサポートするのは時間の無駄だ。

提案(3案)
・i386とi486以降に分けて、それぞれサポートする
・i386アーキを捨てる。i486という名前のアーキを新たに作成する
・i386の名前のまま、実際はi486以降必須にする

てなところか。酔ってるので間違い勘弁。

112 :105:04/12/15 13:38:53
>>109
まずメインスレッドがありますよね?これをスレッドAとします。
そしてpthread_createで新しいスレッドを作って動かします。これをスレッドBとします。
Bで何か作業をやらせておいて、AではBが終わった瞬間、Bの計算結果を使った処理をします。
ところがBが終わったという判定をする方法がわからないのです。
それからpthread_joinはAの作業が止まってしまうので使えません。
以下のプログラムで、isfinished()という関数がありますが、
このようにスレッド識別子pthread_tを使ってスレッドの終了を判定したいのです。

113 :デフォルトの名無しさん:04/12/15 13:39:43
int global_value;

/*スレッドB*/
void thfunc(void *dat)
{
  /*ここでスレッドBの計算を行う
  最終的にglobal_valueに計算結果の値が入る*/
}

/*メイン(スレッドA)*/
int main()
{
  pthread_t th;
  pthread_create(&th, NULL, thfunc, NULL);

  while(1){

    /*あるループを伴う作業*/

    /*Bで計算が終わったか?*/
    if( isfinished(th) ){
      /*global_valueを使う*/
    }
  }
  return 0;
}

114 :デフォルトの名無しさん:04/12/15 13:49:34
isfinished()は架空の関数です。これに類する関数があると思うのですが、
pthreadのリファレンスには載っていませんでした。
もしjavaが分かるようでしたら、スレッドクラスのisAlive()と同じものと思ってください。
あるいはjavaの場合はjoin()する際タイムアウト時間が設定できるので、
もしCでもそのような方法があるようでしたら、教えてください。

115 :デフォルトの名無しさん:04/12/16 02:44:40
某サイトでWinSockでサーバーを作る方法について勉強していたら、
「GUI アプリケーションの場合は、プロセスの主スレッドで呼び出さないようにしてください」
と書いてあったのですが、
これはスレッドを作ってそこでやればいいということですか?

116 :デフォルトの名無しさん:04/12/16 02:59:50
GUIが固まってWindowが再描画されなかったりしても良いなら
単一スレッド上でブロッキングソケットを使っても構わないよ。

117 :デフォルトの名無しさん:04/12/16 09:00:42
そう。非同期などもあるが。

118 :115:04/12/16 11:42:48
>>116,>>117
ありがとうございます。
別のスレッド作ってやらないとCUIが固まるんですね。

119 :117:04/12/16 13:28:42
>>118
Windowsの仕組みを見てみることをお勧めする。
誰がウィンドうを描画してるのか、メッセージキューなどがキーワード

120 :115:04/12/16 14:35:21
>>119
サーバーとして待機するときにacceptを使った瞬間、
アクセスがあるまで次に進まないので、
ウィンドウプロシージャに送られてくるメッセージなんかも
たまる一方で処理できないということですね?

121 :117:04/12/16 14:58:13
それでよろし

122 :105:04/12/16 16:03:11
せっかく説明したのに誰も答えてくれない
(´・ω・`)ショボーン

123 :デフォルトの名無しさん:04/12/16 16:10:33
>>122
その処理なら condition variable を使えばいいんじゃないの?
なんでわざわざ thread の生存で判断したいのかわからん。

124 :デフォルトの名無しさん:04/12/16 16:12:04
んー、重要なのは、
「別のスレッドが終了したこと」ではなく、
「別のスレッドで行っている処理が終了したこと」なんでしょ?

だったら、自分で書いたようなフラグを使っての判定で良いと思うんだけど。

125 :デフォルトの名無しさん:04/12/16 21:22:00
pthread_cond_timedwaitって秒単位、しかも絶対時刻かよ
ダセエな

126 :デフォルトの名無しさん:04/12/16 22:58:42
は? 第三引数はstruct timespec*なわけだが。


127 :デフォルトの名無しさん:04/12/16 23:18:23
>>125
An absolute time measure was chosen
for specifying the timeout parameter for two reasons.
First, a relative time measure can be easily implemented
on top of a function that specifies absolute time,
but there is a race condition associated with specifying an absolute timeout
on top of a function that specifies relative timeouts.


128 :デフォルトの名無しさん:04/12/16 23:19:39
If the thread is preempted between the first statement and the last statement,
the thread blocks for too long.
Blocking, however, is irrelevant if an absolute timeout is used.
An absolute timeout also need not be recomputed if it is used multiple times in a loop,
such as that enclosing a condition wait.


129 :デフォルトの名無しさん:04/12/17 01:55:39
英語なので翻訳します。(要約しながら)

「マニュアル読め」

130 :デフォルトの名無しさん:04/12/17 02:19:57
驚愕に値するマヌケ野郎だな

131 :デフォルトの名無しさん:04/12/17 03:22:41
俺の感覚からすれば、今のケースに「マヌケ」ってのは
どうもしっくりこない。

マヌケ野郎ならなおさら。

なんでだろ

132 :デフォルトの名無しさん:04/12/17 10:37:17
ノータリンならばよろしいか。

133 :デフォルトの名無しさん:04/12/17 11:06:25
うすら間抜けがMT-Safe。

134 :デフォルトの名無しさん:04/12/22 19:31:23
マルチスレッドって難しいな。
whileの無限ループが入ったスレッドを二つ立ち上げるだけで一気にCPU使用率が100%いく。
一つ目ならまだなんとか20%台なんだが。
スレッドってこんなものなのか?

135 :デフォルトの名無しさん:04/12/22 19:35:24
そんなもんです。

136 :134:04/12/22 19:45:16
>>135
どうも。

137 :デフォルトの名無しさん:04/12/22 21:44:12
そりゃビジーループを動かしゃそうなる。
一つで20%しか食わないって方がOSのスケジューラに問題ありそうな。


138 :デフォルトの名無しさん:04/12/22 21:51:08
キャッシュ溢れなんじゃね?

139 :134:04/12/23 18:49:07
>>137->>138
どうも。
それから、
同じスレッドを複数呼び出したりしたら、そのスレッド内のローカル変数はどうなりますか?
例えば、 a という数値型変数をローカル変数として宣言してあって、
そのスレッド内で一定時間おきに a の値を一つずつ増やしていく・・・
ということをした場合、このスレッドを2つ3つと走らせた場合に
a の値は・・・?

2倍、3倍になりますか?
それとも各々のスレッド内で独立した変数として通常通り一つずつ増えていきますか?

140 :デフォルトの名無しさん:04/12/23 19:34:26
Cの場合、static変数は全関数呼び出しインスタンスで共通(共有)、
auto変数は全関数呼び出しインスタンスで別個。

141 :134:04/12/23 20:06:20
>>140
えっと・・・
ということは、staticをつけずに宣言した場合は別々ということですね。
ありがとうございます。

142 :デフォルトの名無しさん:04/12/23 21:45:29
>>134

ビジーループには0.1秒、または0.05秒Sleepを置くのが常套手段



143 :デフォルトの名無しさん:04/12/24 19:21:41
recvfromしてるスレッドを停めるとき
もっともスマートあるいはエレガントで
標準的な方法は?

144 :デフォルトの名無しさん:04/12/24 19:23:55
lockを使った排他による停止。

145 :デフォルトの名無しさん:04/12/24 20:09:06
socketをclose

146 :デフォルトの名無しさん:04/12/24 20:27:04
psしてkill

147 :デフォルトの名無しさん:04/12/24 20:27:38
syncしてsyncしてsyncしてhalt

148 :デフォルトの名無しさん:04/12/24 20:30:32
アアナルほど。
失敗終了させればいいのか。


終了フラグ立ててダミーパケットを送ってみたりしてたんだが、
何か随分無駄っぽい気がしてたんだよな。
「パケットとりこぼしたらやだな」ってのもあったし。

最初、終了フラグに揮発性を設定し忘れてたし。

149 :デフォルトの名無しさん:04/12/24 20:31:44
pthread_kill()でEINTRを起こす。

150 :デフォルトの名無しさん:04/12/24 23:18:13
>同じスレッドを複数呼び出したりしたら、そのスレッド内のローカル変数はどうなりますか?
>例えば、 a という数値型変数をローカル変数として宣言してあって、
>そのスレッド内で一定時間おきに a の値を一つずつ増やしていく・・・
>ということをした場合、このスレッドを2つ3つと走らせた場合に
>a の値は・・・?

すいません、139じゃないんですけど、ちょうど悩んでたんで便乗でおしえてください。
上記の139さんの質問、Cの場合は答えて頂いてますが、Delphiだとどうなるでしょうか?

さらに上の例で言うと、aがローカルではなく、スレッドのpublicなメンバーだったらどうなるでしょうか?

151 :デフォルトの名無しさん:04/12/24 23:54:08
「スレッドのpublicなメンバー」って何やねん。

152 :デフォルトの名無しさん:04/12/25 00:05:20
>>151
TThreadから派生させて作ったクラスのpublicメンバ変数ってことです。
こんな感じ。
type
TMyThread = class(TThread)
private
{ Private 宣言 }
public
a: integer;
protected
procedure Execute; override;
end;


153 :デフォルトの名無しさん:04/12/25 00:12:37
Delphi付属のサンプルコードに、スレッドを複数立ち上げてソートするコードなかったか?

154 :150:04/12/25 00:15:56
すんません、6Personalなんですが、サンプルコードついてないっぽいです...

155 :デフォルトの名無しさん:04/12/25 00:36:01
scheme(scm)でスレッドを実装したいときはどうすればいいのですか?
make-engineがそれにあたるのでしょうか…

156 :デフォルトの名無しさん:04/12/25 00:41:03
>>152
グローバル変数と一緒。

157 :デフォルトの名無しさん:04/12/25 00:46:25
>>156
回答ありがとう。
しかし...グローバルと一緒ですか...
Priveteならたぶんスレッド内で独立した変数になるんだろうけど、メインのフォーム
から操作する必要あるんですよねえ。
publicな手続きつくってその中でaを操作すればいいのかな。

158 :デフォルトの名無しさん:04/12/25 00:50:57
>>157
御免、言っている意味がよくわからない。
スレッドローカルな変数で、グローバル変数とローカルな変数の中間。
生存期間: そのスレッドが終了すると(TThreadが消えると)なくなります。
アクセス: パブリックなので、アドレス分かればどこからでもアクセス可能。

159 :デフォルトの名無しさん:04/12/25 00:52:06
で、スレッド毎に確保。
そのスレッドから見ればグローバル変数と一緒。

160 :157:04/12/25 14:54:06
なるほど、スレッドローカルな変数ですね。説明ありがとう。
僕も最初そうかと思ったんですけど、実際に動かして見るとどうも動きがちがうのよねえ。

152であげた例でいうと、メインフォームのほうでこいつのインスタンスを二つ作って

Thread1:=TMyThread.Create(False);
Thread2:=TMyThread.Create(False);

でaを操作する。

Thread1.a:=1;

TMyThreadのExecuteでaを監視してるんですが、これやると、なぜかThread2も
反応してしまうんですよ...

どこが間違ってるんでしょうか。ご指導お願い致します

161 :デフォルトの名無しさん:04/12/27 23:56:30
TMyThread のインスタンスはメインスレッドでつくられるんだから、単なるフィールド変数だろ

162 :デフォルトの名無しさん:04/12/28 10:56:51
これデルファイ?C++ならメモリアドレス見れば一発なのに

163 :デフォルトの名無しさん:04/12/28 22:27:56
>>160
スレッドローカルだからでは?
もう自分でも何をしたいのか、よくわかっていないでしょ?

164 :157:04/12/28 23:38:05
皆さんコメント感謝
163さん言うとおり、相当煮詰まってあれこれ試しているうちに
何がなんだか混乱していたのも事実です。

aをpriveteに移して、aをメインスレッド側からいじらないように改造
したら誤動作なくなりました。
正直言うとまだ明確にはわかっていません。

あまりプログラミングの知識ないのですが、最初ごく単純なツール
の予定だったので私でもできるかなと引き受けたのですが、あれよ
あれよと機能追加要求が来て大変です。
でもまあ、あれこれ迷いながら楽しんで仕事できてます。

とりあえず変数の種類とスコープを復習しなおすことにします。
ありがとう。


165 :デフォルトの名無しさん:05/01/14 07:34:30
超高速で操作するとなんかスタックが壊れる・・・
「無効なアンワインド対象がアンワインド操作で検出されました。。」
ってなんやねんわけわかめ!わけわか!

166 :デフォルトの名無しさん:05/01/14 08:31:34
スタック壊れてるのはたいてい自分でメモリを壊してるせい

167 :デフォルトの名無しさん:05/01/16 11:34:13
>>165
「アンワインド」の意味は分かっているの?

スタック上のアンワインド用のメタデータが壊れているんでしょう。
それが餡ワイン度している時に見つかったと。


168 :デフォルトの名無しさん:05/01/16 14:27:02
うへぇ、不味そう<餡ワイン

169 :デフォルトの名無しさん:05/01/19 13:16:21
クリティカルセクションオブジェクトのLockCountが-1でOwningThreadもNULLで
どこもロックしてないのにLockSemaphoreだけロックされててわけわかめ。なんじゃこれ
もう疲れた

170 :デフォルトの名無しさん:05/01/23 22:50:00
スレッドの生成や消滅って、implicitなmemory barrierになると考えて良いのでしょうか?
#POSIX, Win32両方使ってます。


171 :デフォルトの名無しさん:05/01/24 13:58:45
状況がつかめん。
コードで示せ。

172 :170:05/01/24 14:58:01
メインスレッドが大域変数gFooに1を、排他制御なしで書く

メインスレッドがスレッドTを生成する

TがgFooの値を排他制御なしで読む

の順で処理が発生したとき、Tが観測するgFooの値が1であることが保証されているかが知りたいです。
メインスレッドは1を書いた後、当面gFooにアクセスしないと仮定してOKです。

よろしくおながいします。



173 :デフォルトの名無しさん:05/01/24 16:33:36
>>172
環境によっては保証されない。
何故ならば、大域変数へのアクセス完了を待ってスレッド生成する保証がないから。

174 :170:05/01/24 18:28:24
>>173
> 環境によっては保証されない。
> 何故ならば、大域変数へのアクセス完了を待ってスレッド生成する保証がないから。

gFoo = 1;
// ここ
pthread_create();

というコードで、「ここ」と書いたところはsequence pointで、かつ「ここ」ではまだシングルスレッド
状態なわけですが、それでも「大域変数へのアクセス完了を待つ」が保証されないのでしょうか?

>> スレッドの生成や消滅って、implicitなmemory barrierになると考えて良いのでしょうか?
という質問に戻ってしまうわけですが・・。

175 :デフォルトの名無しさん:05/01/24 18:52:29
そのコードなら確実に1は保証されるぞ。
1の代入が完了しなければスレッドが作られないんだから。
1の代入とスレッド作成は同一スレッドで行われるわけだからね。


176 :デフォルトの名無しさん:05/01/24 18:56:38
>>175
前スレの最後の方とか http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf を見た上でもそう思う?



177 :デフォルトの名無しさん:05/01/24 19:09:38
アセンブラのレベルで、同一スレッドでmov命令(1代入)発行した後に関数コール(pthread_create)
する場合でも、movが完了する前にpthread_createされることって有り得るの?
そういう話ではないよね?コンパイラのオプティマイザによって変わってくるということかね?


178 :デフォルトの名無しさん:05/01/24 19:11:43
Pentium4とかの最近のCPUだと有り得る

179 :デフォルトの名無しさん:05/01/24 19:13:19
コンパイラのオプティマイズ(命令のreorder)の話もあるけど、それに加えて、
・コンパイラがreorderしなくても、CPU(H/W)が命令をreorderするかもしれない
・あるCPUでmovが完了したからといって、その値が別のCPUから観測可能かはわからない
ということでは?

180 :デフォルトの名無しさん:05/01/24 19:20:28
どうも。勉強不足でした。恥ずかしい。
前スレッドを見たいが見られない。困った。


181 :デフォルトの名無しさん:05/01/24 19:23:32
>>180
memory barrierでググればそれ関係の論議は大抵見つけられると思う。

182 :170:05/01/24 19:33:12
pthread_createやCreateThreadの先頭にmemory barrier(full fence)が挿入され
ているのか、挿入するよう規格が要請しているかが知りたいです。

#またはfenceなどなくても大丈夫というならその理由を


183 :デフォルトの名無しさん:05/01/24 20:19:01
volatile

184 :デフォルトの名無しさん:05/01/24 20:22:17
またvolatile厨か・・・

185 :デフォルトの名無しさん:05/01/24 21:19:14
total store order

186 :デフォルトの名無しさん:05/01/24 21:22:38
またtotal store order厨か・・・

187 :デフォルトの名無しさん:05/01/24 21:24:35
>>185
詳しく
>>186
ポカーン

188 :デフォルトの名無しさん:05/01/24 21:24:42
どうでもいいじゃん

189 :デフォルトの名無しさん:05/01/24 21:25:48
スレッドセーフなライブラリつかっとけばOK

190 :170:05/01/24 21:39:43
>>185
> total store order
すみません、memory modeに疎く、TSOだけだとちょっと意図が汲めません。結局>>172の例は
safe/unsafeどちらだとお考えでしょうか?





191 :170:05/01/24 21:40:28
mode -> model

192 :デフォルトの名無しさん:05/01/24 21:54:32
>>170
volatile とか VC/VC++ の _ReadWriteBarrier とかその辺の問題はともかく、
MSのサンプルでも、Win32のThreadProcで、渡されたデータ、実体はポインタ、
が挿すメモリアクセスするような場合にMemoryBarrier()呼び出しをしている例は
一度も見たことなく、逆の例は沢山あるので、
Win32のCreateThreadはメモリバリアになってるような気がします。

具体的なドキュメント等の記述は見つからないけど。

193 :デフォルトの名無しさん:05/01/24 21:55:20

編集していたらなんか「、」が多くて変な文になってしまった。

194 :デフォルトの名無しさん:05/01/24 22:04:25
この名前空間、クラス、およびメンバは、.NET Framework Version 1.1 だけでサポートされています。

195 :デフォルトの名無しさん:05/01/25 00:30:21
>>170
POSIXではpthread_create()もpthread_join()もMemory Synchronizationが
要請されてますな。
ttp://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_10

196 :170:05/01/25 12:12:35
>>192, 195
ありがとうございます!!
スッキリ解決です。



197 :デフォルトの名無しさん:05/01/25 22:20:49
このスレでvolatileって言葉が出てきたらほぼ100%厨房な間違いってことでFA。




198 :デフォルトの名無しさん:05/01/25 23:09:05
つまり
>>56, >>183, >>184, >>192, >>197
はほぼ100%厨房な間違いってことでFA。

199 :デフォルトの名無しさん:05/01/25 23:09:07
volatileはthreadじゃなくてinterruptのときのモノだしな。

200 :デフォルトの名無しさん:05/01/25 23:34:26
またvolatile厨か・・・

201 :デフォルトの名無しさん:05/01/26 00:34:16
>199
ISO C/C++的にはシグナルハンドラからアトミックに更新したい変数に用いる型、だね。
volatile sig_atomic_t。この使い方以外でvolatileって語は出てこないし。

あーあと、POSIXにはまったく登場しないね。

202 :デフォルトの名無しさん:05/01/26 00:36:59
>>198
56はリア厨だったりする罠。

>通常、小さい変数などはvolatileをつけるべきだってのは知っているのですが、
必要ありません。

>const_castでvolatileを変える仕様はMS VC7.1には入っていないし、
>同期をかけるクラスはすべてvolatile版も作れということですかねぇ。
CRITICAL_SECTION使え


203 :デフォルトの名無しさん:05/01/26 14:01:57
またvolatile厨か・・・

204 :デフォルトの名無しさん:05/01/26 15:27:42
またvolatile厨か・・・

205 :デフォルトの名無しさん:05/01/26 17:22:23
またvolatile厨か・・・

206 :デフォルトの名無しさん:05/01/26 19:04:35
またvolatile厨ですね・・・


207 :デフォルトの名無しさん:05/01/26 19:13:18
(またvolatile厨)厨ですよ・・・

208 :デフォルトの名無しさん:05/01/26 19:14:25
((またvolatile厨)厨)厨ですよ・・・

209 :デフォルトの名無しさん:05/01/26 19:58:21
こんな(((volatile厨)厨)厨)厨見たことない・・・

210 :デフォルトの名無しさん:05/01/26 20:36:31
こんなところで三段落ちを見るとは…さすがvolatile厨だな

211 :デフォルトの名無しさん:05/01/27 00:31:20
来たれ、void厨!

212 :デフォルトの名無しさん:05/01/28 00:28:17
ということにしたいのですね。

213 :デフォルトの名無しさん:05/01/28 02:46:28
取り込み中済まないんだけど、mutex で待たないで条件変数で待たなきゃいけない場合って
どんな時ですか? 長い時間掛かる処理を待ってる時は、条件変数使った方が良いみたいですが。

ググったら見つかったとこ。

ttp://www.imou.to/~AoiMoe/column/pthread/pthread_cancel.html

これは、絶対に mutex で待っちゃダメって事じゃないですよね。

214 :デフォルトの名無しさん:05/01/28 03:08:46
>>213
condition variableで待つ場合ロックしているmutexを一時的に
解放してくれて、かつ、signalやbroadcastで条件が調った時に
一時的に解放していたmutexを自動的にロックしてくれる。
なので、時間とかの問題ではなく、デッドロックを避けつつ、
必要な排他処理を過不足無く行なうために必要であれば、
condition variableを使うか、自前で同等の処理を行なうことに
なる。
mutexをロックしたまま別のmutex待ちをして良いのなら、
condition variableを使う必要は無い。

215 :デフォルトの名無しさん:05/01/28 03:38:10
>>214
どうもありがとうございます。

自分が考えていたのは、mutex が一時的に解放されてもそれほど嬉しく無さそうな
処理だったので、まずは mutex のみで実装してみようと思います。

216 :デフォルトの名無しさん:05/01/30 17:49:59

volavolavolavolavolavolavolavolavolavolaァァァァーー!

217 :デフォルトの名無しさん:05/01/30 18:28:51
intサイズ以下なら、volatileつければ、
マルチスレッドのときにも排他は不要ですよね?

218 :デフォルトの名無しさん:05/01/30 18:31:21
そうですね

219 :デフォルトの名無しさん:05/01/30 18:35:10
>>217
へ?

220 :デフォルトの名無しさん:05/01/30 18:57:20
CCSを使ってモデル化して検証する

221 :定期的にこの話題出てくるな。つりだろうか ?:05/01/30 21:11:48
>>217
不要だと思うなら、そうすればいい。

後で泣きを見ても知らんけどな。

222 :デフォルトの名無しさん:05/01/30 21:18:59
>>221
100%煽りでしょ。
せっかくの「またvolatile厨か・・・」への前振りを無駄にするな。

223 :デフォルトの名無しさん:05/01/31 11:01:30
またvolatile厨か・・・

224 :デフォルトの名無しさん:05/01/31 19:34:43
またvolatile厨厨か・・・

225 :デフォルトの名無しさん:05/01/31 23:11:21
coutを複数スレッドから利用する場合改行までの間で出力が混ざってしまうのは、
下記のページみたいな感じでmutexやクリティカルセクションを使ってロックするしかないの?
なんか重そうだけど。
http://www.athomejp.com/goldfish/mfc/cobject/thread.asp

226 :デフォルトの名無しさん:05/01/31 23:41:26
心配しないでもI/Oの方が遅い。
stringstreamの場合は工夫した方がいいと思うが。

227 :デフォルトの名無しさん:05/02/02 23:23:58
クリティカルセクションならカーネルレベルまで話が及ばない(ほとんどのばあい)
から重くないと思われ。

228 :デフォルトの名無しさん:05/02/03 01:12:21
どっちもI/Oの重さを考えたら無いようなもん。
応答性やパフォーマンスを気にするならcoutなんかやめて
非ブロッキングI/Oを使えばいい。

229 :デフォルトの名無しさん:05/02/03 10:36:44
キタ━━━━(゚∀゚)━━━━!! @cppll ML

>επιστημηです。
>
>で、関連事項なんすけど、スレッド間で共有する変数の類は
>Mutexなんかでガードしてないならvolatileつけとくのが無難
>なんでしょかしらやっぱ?

えぴすさんでもひっかかっちゃうのね。

230 :デフォルトの名無しさん:05/02/03 12:09:18
>>229
「でも」とはなんだ「でも」とは!
奴だからこそ、だろう。

231 :デフォルトの名無しさん:05/02/03 12:17:26
レスはもっと香ばしいけどね。レジスタがどーたらとか。

232 :デフォルトの名無しさん:05/02/03 12:50:58
>>229の文章ならそんな問題ないでしょう?

排他のためにやるわけじゃなくて、
最適化の抑止の事だけを話しているのかも知れないから。
十分って言っているわけじゃなくて、無難だしね。まあ、

>で、関連事項なんすけど、

何に関連していたかにも依るわけですが…


233 :デフォルトの名無しさん:05/02/03 13:01:08
constと同じとこにvolatileやconst volatileも書けるっていうお話でしたとさ。

234 :デフォルトの名無しさん:05/02/03 21:34:24
>>232
> 排他のためにやるわけじゃなくて、
> 最適化の抑止の事だけを話しているのかも知れないから。
排他が関係しないスレッド間の共有って、全スレッドがreadしかしないとかそういうこと?
確かにそれなら定数読むのとかわらんから、volatileもメモリバリアもいらないけど、そういう文脈なのかなぁ。

235 :デフォルトの名無しさん:05/02/04 01:21:32
しかし、最近そこかしこでmutexのかわりに/mutexに加えてvolatileって騒いでる人を見かけるんだけど
国内でだれかvolatileを布教してる人でもいるんですか?

236 :デフォルトの名無しさん:05/02/04 05:57:04
またvolatile厨厨か・・・

237 :デフォルトの名無しさん:05/02/04 06:10:36
coutを複数スレッドから利用する場合改行までの間で出力が混ざってしまうのは、
下記のページみたいな感じでmutexやクリティカルセクションを使ってロックするしかないの?
なんか重そうだけど。
http://www.athomejp.com/goldfish/mfc/cobject/thread.asp

238 :デフォルトの名無しさん:05/02/04 08:26:34
>>237
思い込みはどうでもいいからベンチマークとれよ

239 :デフォルトの名無しさん:05/02/04 09:00:25
スレッドプログラミング初心者です。
volatileはマルチスレッド対応ですか?教えてください。

240 :デフォルトの名無しさん:05/02/04 09:10:22
>>237
coutをvolatileにしろ

241 :デフォルトの名無しさん:05/02/04 09:23:38
アプリケーションがシングルスレッドである間しか書き込みしない事が分かっている場合
(スレッドが2つ以上になった時点では読込しか行わない場合)
排他処理したり、volatile修飾する必要は無いの?

242 :デフォルトの名無しさん:05/02/04 09:42:47
>>241
またvola (ry

えーとね、排他は必要ない。169-170の質問と実は同じ内容だから、
回答は >>192 >>195 を参照のこと。

あと、volatileはいい加減やめい。スレッドとvolatileは無関係。


243 :デフォルトの名無しさん:05/02/04 20:15:08
ボラボラボラボラボラボラボラボラボラタイール!

244 :デフォルトの名無しさん:05/02/04 22:16:44
volatileってコンパイラの想定外の理由で変数の内容が変わるので最適化の対象にしないでくれって宣言だよね?

245 :デフォルトの名無しさん:05/02/04 22:22:00
>>244
ウザい

246 :デフォルトの名無しさん:05/02/04 22:26:20
bool型の値に書込と読込を色々なスレッドから同時にするような場合排他をしない場合は、
trueに変えたはずなのにまだfalseと読み出されたりするくらいで、
いきなりスレッドが死んだりする事は無いよね?

247 :デフォルトの名無しさん:05/02/04 22:39:07
>>245
お前がな。
そもそもこのスレでのvolatile発言はすべて煽り。ほいほい釣られるのはやめてくれ。

248 :デフォルトの名無しさん:05/02/04 23:12:27
>>247
お前がな。
そもそもこのスレでのvolatile発言はすべて煽り。ほいほい釣られるのはやめてくれ。

249 :デフォルトの名無しさん:05/02/05 01:22:51
volatileにしてから、女の子にもてもてです。

250 :デフォルトの名無しさん:05/02/05 02:14:05
>>246
volatileと宣言すれば完璧です。

251 :デフォルトの名無しさん:05/02/05 02:43:57
volatileって飛びますよね


252 :デフォルトの名無しさん:05/02/05 15:08:47
volatileほいほい状態のなか申し訳がないのだが、c/c++のvolatileと
java/c#のvolatileは意味合いが違うという理解でいいのでしょうか?
普通のブラウザからなので過去スレッドに既出ならすまそ。

253 :デフォルトの名無しさん:05/02/05 16:13:11
同じ

254 :デフォルトの名無しさん:05/02/05 16:53:32
>>252
c/c++の言語仕様にはマルチスレッドとvolatileとの関係なんて定義されていない。
きちんと定義されているものと未定義のものとを比較して、
意味合いが違うとかどうとか言うのは意味がない。

255 :デフォルトの名無しさん:05/02/05 17:00:36
bool f;//global

while (f)
{
;
}

は最適化で

if (f)
{
for(;;) {}
}

になったりはしないの?

256 :デフォルトの名無しさん:05/02/05 17:10:58
>>255の言いたいことがわかる人いる?

257 :デフォルトの名無しさん:05/02/05 17:15:29
>>256


コンパイル時の最適化についての話でしょう。
前者の記法は後者の記法のように変換されて解釈されるのではないか、
という質問だと思います。

258 :デフォルトの名無しさん:05/02/05 17:59:55
>>254
>c/c++の言語仕様にはマルチスレッドとvolatileとの関係なんて定義されていない。
ありがとう。なんかすごく腑に落ちました。
現実には独自仕様などでそれなりの関係で動いちゃう処理系が多々あるってことで
しょうね。混乱するほうが自然なような気もしてきました。


259 :デフォルトの名無しさん:05/02/05 18:12:37
>>257
今でも最適化でこんな間違いが生じる恐れあるのか?

260 :デフォルトの名無しさん:05/02/05 18:34:22
int f = 1;
while (f) {
/* ループ中でfは参照されない */
}

こういうコードなら、それに近い最適化される
可能性もあるんじゃない?

261 :デフォルトの名無しさん:05/02/05 20:40:40
ていうかね、例えば
void f(const char *str) {
 int i;
 for (i = 0; i < strlen(str); ++i) {
  ...
 }
}
なんてコードは、
慣れてる人が見れば「毎回長さを判定している糞コード」なわけだけど
VCとかだと、このstrlenをループの外に出しちゃうわけよ。

こういう最適化をするコンパイラが
ループ内で変更していない変数の値を、ループ時に毎回評価するなんてありえないわけで。

262 :デフォルトの名無しさん:05/02/05 20:51:20
> VCとかだと、このstrlenをループの外に出しちゃうわけよ。

はつみみです

263 :デフォルトの名無しさん:05/02/05 21:44:43
ループじゃないけど,最適化に関係することでこんなのがあります.
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdncode/htm/secure10102002.asp?frame=true&hidetoc=true


264 :デフォルトの名無しさん:05/02/05 23:29:58
>>262
VCについては知らんが、gccだとpureアトリビュートってのを
関数に宣言してやると、そういう動作をするな。

以下、Infoより引用。
---
`pure'
Many functions have no effects except the return value and their
return value depends only on the parameters and/or global
variables. Such a function can be subject to common subexpression
elimination and loop optimization just as an arithmetic operator
would be. These functions should be declared with the attribute
`pure'.

265 :デフォルトの名無しさん:05/02/05 23:43:07
>>264
pureって意味わかりにくね?
C++の純粋仮想関数を想像しちまう。

Oracle PL/SQLのdeterministicの方がいいな。

266 :デフォルトの名無しさん:05/02/06 00:05:45
pure function/純関数ってのは古くからある一般的な用法です。

http://h18009.www1.hp.com/fortran/docs/vf-html/azsumm/rfpure.htm
http://publib.boulder.ibm.com/infocenter/macxhelp/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc07fn_attrib_pure.htm
http://documents.wolfram.com/v5/TheMathematicaBook/PrinciplesOfMathematica/FunctionalOperations/2.2.5.html

267 :デフォルトの名無しさん:05/02/06 04:49:58
結局どうなんですか?

268 :デフォルトの名無しさん:05/02/06 09:14:47
volatileとつければ完璧です。

269 :デフォルトの名無しさん:05/02/06 10:48:37
volatile相談室に改名したら?

270 :デフォルトの名無しさん:05/02/07 09:07:40
volavolavolavolavolavolavolavolavolavolaァァァァーー!

271 :デフォルトの名無しさん:05/02/08 01:04:08
ごまかして終わりですか?しょせん2chですもんね。

272 :デフォルトの名無しさん:05/02/08 03:51:12
volatile宣言はコンパイラの吐くコードの最適化を抑制します。

そのことと、マルチスレッドプログラミングがどう絡むのかというと、
最適化を抑制することが、
マルチスレッドプログラミングにおいて発生する問題を解決したり、
未然に防いだりするのに有効な場合があるのです。

もちろん、volatileの使用は、起こりうる問題の全てを解決したり、
予防したりするものではありません。そとのきは、
mutexを使うなりして別の手段を用いる必要があるでしょう。

273 :272:05/02/08 03:58:21
そとのときは...云々は、
そのときは の誤りです。スレを汚してごめんなさい。



274 :デフォルトの名無しさん:05/02/08 04:09:37
そとのときはそのときはのあやまりですはそとのきはそのときはのあやまりですのあやまりです

275 :デフォルトの名無しさん:05/02/08 04:17:12
早口言葉?ちょっと笑えた。

276 :272:05/02/08 04:46:42
あ...

誤)そとのとき
正)そのとき

ではなくて、

誤)そとのき
正)そのとき

だと指摘してるのかな?
2重にスレを汚してごめんなさい。

277 :デフォルトの名無しさん:05/02/08 09:24:29
ま た v o l a 厨 か

「場合がある」程度で使われちゃ迷惑なんだよ
つか仕組を理解していない証拠だ

278 :デフォルトの名無しさん:05/02/08 09:46:40
だーかーらー、volatileとmulti-threadは関係無いっての。

279 :デフォルトの名無しさん:05/02/08 10:35:50
>>272
i = i++; 並みの珍説だな


280 :デフォルトの名無しさん:05/02/08 11:03:11
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclang/html/_langref_volatile.asp?frame=true&hidetoc=true

に,

One use of the volatile qualifier is to provide access to memory locations used by
asynchronous processes such as interrupt handlers.

って書いてあるんだけど...
さらには,

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclang/html/_pluslang_const_and_volatile_pointers.asp?frame=true&hidetoc=true

では,

When a name is declared as volatile, the compiler reloads the value from memory
each time it is accessed by the program.
This dramatically reduces the possible optimizations.
However, when the state of an object can change unexpectedly,
t is the only way to ensure predictable program performance.


とあります.
少なくともVC++の場合は(気をつければ)volatile使うのもありなのでは?
もちろん,C++の規格上は,マルチスレッドとvolatileの関係なんか何も定められていないと思うけど.

親の敵がごとくvolatileを嫌っている理由を知りたいです.

281 :デフォルトの名無しさん:05/02/08 11:31:05
マルチスレッドでの同期とはアクセスタイミングの問題ではないから、
volatileは何の解決にもならないんだよ。
volatileで解決したように見えるものを別のところに持っていって正しく
動く保証は全くない。

自説に固執する前にちっとは勉強したらどうよ。


282 :デフォルトの名無しさん:05/02/08 11:43:37
言語の規格で定められていない以上,VC++で動いたからって,
他の環境でも正常に動作するとは限らないというのは全く同意です.
正直にいうと,マルチスレッドプログラミングはWindows上でしか
経験がありません.それで,

>> 自説に固執する前にちっとは勉強したらどうよ。

自説に固執しているつもりもありませんが,
勉強する意欲はありますので,よろしければ,

>> volatileは何の解決にもならないんだよ。

ということを学習できる書籍,URLなどをご紹介ください.
英語でもかまいません.

283 :デフォルトの名無しさん:05/02/08 12:04:03
Memory Mapped I/O 以外に volatile を使う必然性が解らん…
Atomic じゃない処理でアクセスしてるなら、気休めにもならんぞ。

284 :デフォルトの名無しさん:05/02/08 12:26:35
>>283
> Memory Mapped I/O 以外に volatile を使う必然性が解らん…
> Atomic じゃない処理でアクセスしてるなら、気休めにもならんぞ。
cppllの受け売り?mmapでもvolatileはまずい。

285 :デフォルトの名無しさん:05/02/08 12:27:18
あ...私もところかまわずvolatile使いまくってるわけじゃないです.

例えば,
bool 型の変数(初期値false)があって,ある一つのスレッドが,
その値をtrueに変更し,他のスレッドは,その変数の値が
trueになるのを待ち構えている...的な状況に使っています.

同期オブジェクト使えばいいじゃん.と思われるかもしれませんが,
例えば,上のbool型の変数がグローバル変数であった場合,
単純に同期オブジェクトに置き換えることも出来ません.
初期化の問題もあるし,それをクリアしてもリソースをいつ
OSに返せばいいかという問題もあります.

より具体的には,
http://www-6.ibm.com/jp/developerworks/java/040416/j_j-jtp02244.html
の後半にある,
「リスト1. volatileフィールドを「見張り」変数として使う」
的な利用の仕方をしています.

上記サイトは言語がjavaですし,古いjavaのメモリ・モデルでは,
最適化のリオーダの定義が甘く,うまく動かないと結論づけらているので,
あんまり適切なソースではありませんが,私が提示できるのはこれくらいです.

286 :デフォルトの名無しさん:05/02/08 12:27:56
>>280
such as interrupt handlers.

でしょ?MSもスレッドとの相互作用は言及していないやん。


287 :デフォルトの名無しさん:05/02/08 12:28:37
まだ言語の規格うんぬん言ってるよこの人……。


288 :デフォルトの名無しさん:05/02/08 12:29:36
>>285
>bool 型の変数(初期値false)があって,ある一つのスレッドが,
>その値をtrueに変更し,他のスレッドは,その変数の値が
>trueになるのを待ち構えている...的な状況に使っています.
残念ながらダメな使用例の典型です。
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf


289 :デフォルトの名無しさん:05/02/08 12:36:01
ソースコード中にvolatileなんてDOS時代で割り込み使うときに書いただけだな。

>>285
変数の操作前後に同期オブジェクト使用。

290 :デフォルトの名無しさん:05/02/08 12:42:43
>>285
> 例えば,
> bool 型の変数(初期値false)があって,ある一つのスレッドが,
> その値をtrueに変更し,他のスレッドは,その変数の値が
> trueになるのを待ち構えている...的な状況に使っています.

バカの典型例。

> 同期オブジェクト使えばいいじゃん.と思われるかもしれませんが,

いいじゃん、じゃなくてそれが正しい解。

> 例えば,上のbool型の変数がグローバル変数であった場合,
> 単純に同期オブジェクトに置き換えることも出来ません.
> 初期化の問題もあるし,それをクリアしてもリソースをいつ
> OSに返せばいいかという問題もあります.

単なる言い訳。


291 :デフォルトの名無しさん:05/02/08 12:51:18
>>284
cppll ってのが何か知らんが、Mapped Memory の話なぞしていない。
メモリ空間に配置された I/O ポートの話。

>>285
うむ。最悪な用途だな。
>同期オブジェクト使えばいいじゃん.と思われるかもしれませんが,
使えばいいじゃん。

292 :285:05/02/08 12:54:04
>>288
ソースの提示ありがとうございます.
早速読んでみます.

> 残念ながらダメな使用例の典型です。

でも,ちょっとショックです.
285の使用例を許すOS自体が存在しないということなら,さらにショック.

293 :デフォルトの名無しさん:05/02/08 13:02:24
>>292
> でも,ちょっとショックです.
> 285の使用例を許すOS自体が存在しないということなら,さらにショック.
OSっつーかハードウェアとコンパイラね。

(1)シングルコアのシングルCPUの上でしか動かさないプログラムか、
マルチプロセッサだけど強いmemory consistencyを持つハードウェア上でしか動かさないプログラムで、

かつ、

(2)コンパイラの最適化の特徴を完璧に把握している

場合のみboolをロックなしで使用してよし。実質的に常人には判断不可能とおもうが。
特に(2)はコンパイラの作者でもなければわからない悪寒。


294 :285:05/02/08 13:21:24
>>293
解説ありがとうございます.
pdf,まだ読んでませんが,困難さが伝わってきました.

285のような場合は,Windowsの場合ですと,
boolをlongにして,InterlockedExchangeみたいな
API を使っても無駄なあがきでしょうか?


295 :デフォルトの名無しさん:05/02/08 13:30:57
固執しまくってるやん。


296 :デフォルトの名無しさん:05/02/08 13:40:08
>>285 の“trueになるのを待ち構えている”が
ビジーループだったりすると、volatile 以前の問題だったり。

297 :デフォルトの名無しさん:05/02/08 13:47:42
>>294
http://msdn.microsoft.com/library/en-us/dllproc/base/interlockedexchange.asp
などをみると、This function generates a full memory barrier (or fence) and performs ... とかなんとか
説明がある。この意味が分からないなら手を出さない方がいい。

298 :デフォルトの名無しさん:05/02/08 13:51:53
>>294
InterlockedXXXはもちろんOKでそ。
基本的にはマルチプロセッサを考えない場合にはスレッド間でのメモリ内容の
同期化は考えなくても良いので、volatile とか _ReadWriteBarriar (VCね)とかで
テキトーに済ませてしまっても問題ない。

でも今時「マルチプロセッサではデッドロック起こします」なんてプログラムは
書かないことが多いんでは?なので他のスレッドが書いたデータを読むとき
には、適当にメモリバリアになる処理を入れておくべき(ドライバ書いているとき
には、リングバッファ - メモリモデルの問題さえなければ、writerとreaderは
並行して動作しうる - とかではまることがある)。

あとJava VMの場合は新し目のJSR-000133 に準拠したものだと、
同じvolatile変数へアクセスするコンテキスト間ではアクセス時点で同期化が
成されるみたいだけど、これはまだ一般的じゃないと思う。

299 :デフォルトの名無しさん:05/02/08 13:56:34
>>298
コンパイラの最適化によるトラブル@シングルプロセッサは無視ですか?

300 :デフォルトの名無しさん:05/02/08 15:44:47
変数の領域が最適化によってレジスタに作られた場合、別のスレッドがこれを参照することの影響ってあるんですか?

301 :デフォルトの名無しさん:05/02/08 15:54:06
>>300
お前が意味不明。

302 :デフォルトの名無しさん:05/02/08 16:26:36
>>300
そのためのvolatileでしょうが。

#って書くとまたvolatile厨云々書く香具師が沸くのかな?

303 :デフォルトの名無しさん:05/02/08 16:28:15
>>299
既出の、
 Javaの場合普通JSR-133を仮定しないで同期化でメモリバリアするから問題起きない。
 サーバ側などVM限定で良くて高速処理が必要なら、JSR-133を仮定して高速な実装を使うこともアリ。

 C/C++ならvolatile とかVCの_ReadWriteBarrier(>>298ではスペルミスしてました)みたいなものでテキトーに。
 (インラインでアセンブラ書ける処理系なら、大抵はメモリへの配置と値のストアを強制できると思う)
 参考:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf_ReadWriteBarrier.asp

ってようなことの他に何か最適化によるトラブルがあったら教えてください。

304 :デフォルトの名無しさん:05/02/08 16:53:58
>>302
外から参照できるような変数がレジスタに割り付けられるような
間抜けなコンパイラが存在するんですか?そりゃすげぇや。

305 :デフォルトの名無しさん:05/02/08 16:56:01
>>304
ごく普通にある。例:GCC


306 :デフォルトの名無しさん:05/02/08 17:01:12
>>304
C/C++ではvolatileでメモリへの割付は強制できるけど、Javaとは違って当該のメモリ位置に
何時データを書き出すかまでは指定できない(読み出しは字面上の位置でメモリから読むこと、
と規定されてるけど)。

んだからさんざ既出の様に「VCの_ReadWriteBarrierみたいなもの」を併用する必要があるわけ。
gccでもvolatile変数に代入した後インラインアセンブラでちょいと参照しておけばOKなんじゃない?
(でもgccってgasにした後で最適化入るんだったような記憶が・・・それだとダメか?)

307 :294:05/02/08 18:15:35
邪魔が入ってpdf読めないでいるうちに重要な投稿がいくつも...

実は,Javaにおけるクラスレベルのロック機能みたいなのを実現したいと思っているのです(とりあえずはWindowsで,言語はC++).
クラスレベルのロックをするための同期オブジェクトは,初期化と後始末の問題があるため単純に静的な変数に出来ません.

また,クラスレベルのロックをするための同期オブジェクトの生成過程もロックしないといけませんし,
それをするのにmutexなどの同期オブジェクトを作っていたのでは,またそのオブジェクトの生成過程をロックしなければいけなくなってきりがないのです.

そこで,volatileと,Interlock系のAPIを使用してクラスレベルのロックをするための同期オブジェクトの生成過程をロックすればよいんでは?
と思いプログラミングしてみたところ,見た目は動いてるっぽいです.
ただ,動作確認をしているマシンが1CPUですので,まだまだ,勉強が必要です.

とりあえずは,今回提示されたpdfを読んでみようと思います.
勉強になりました.ありがとうございました.

308 :デフォルトの名無しさん:05/02/08 18:17:32
>>303
いや、だからね、

> 同期化は考えなくても良いので、volatile とか _ReadWriteBarriar (VCね)とかで
> テキトーに済ませてしまっても問題ない。

「volatileとか」は余計だろ?
メモリバリアを正しく使ったなら無問題だよ。


309 :デフォルトの名無しさん:05/02/08 18:20:05
>>306
> gccでもvolatile変数に代入した後インラインアセンブラでちょいと参照しておけばOKなんじゃない?
参照っていうか、fence命令を挿入だな。Linuxカーネルなんかに_ReadWriteBarriar相当の
マクロなんかがあるから参考にすればいい。


310 :デフォルトの名無しさん:05/02/08 18:23:28
>>302
> そのためのvolatileでしょうが。
全然違う。

volatileによって、
変数の領域が最適化によってレジスタに作られた場合、*自スレッドが* これを参照することの影響を排除すること
はできるが。


311 :デフォルトの名無しさん:05/02/08 18:26:53
>>283
> Atomic じゃない処理でアクセスしてるなら、気休めにもならんぞ。
アトミックかどうかは関係ないでしょう

312 :294:05/02/08 18:33:50
あ...あと,いまさらですが,

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_langref_volatile.asp

に,

The volatile keyword is a type qualifier used to declare that an object can be modified in the program by something such as the operating system, the hardware, or a concurrently executing thread.

ってありました.

313 :デフォルトの名無しさん:05/02/08 18:38:00
>>308
308で言ってることは正しい指摘だと思うんだけど、それはともかくとして

>>298
>コンパイラの最適化によるトラブル@シングルプロセッサは無視ですか?
これの例を聞いてみたわけだけど。エイリアス関係ならvolatile指定でOKだし・・・

314 :デフォルトの名無しさん:05/02/08 18:42:26
>>312
IA32の強めの一貫性を仮定しているんだろうね

315 :313:05/02/08 18:44:04
>>313
↑読み返すと粘着っぽいので反省して取り下げます・・・

316 :デフォルトの名無しさん:05/02/08 18:46:13
>>313
俺に聞かれても困るんだけど・・

volatileはvolatileで修飾した変数Vをレジスタに置かないことは保証するが、V
にアクセスする順序(Vにアクセスしたことが他CPUからみえるようになるタイミ
ング)までは制限しない

ということじゃないの?それ以上はEffectiveC++の作者様にでも聞いてくれろ

317 :デフォルトの名無しさん:05/02/08 19:33:10
> volatileで修飾した変数Vをレジスタに置かないことは保証する

これまた微妙な表現・・・

318 :デフォルトの名無しさん:05/02/08 19:46:18
>>317
参照する場合には、ってことだよね・・・
あと他人の質問に一旦返事しといて、再度聞かれると
「俺に聞かれても困るんだけど・・ 」は反則じゃねーの。

319 :デフォルトの名無しさん:05/02/08 20:05:39
「volatileとmulti threadはまったく無関係」というレスが沢山つくのを見ながら
「このスレッドの人はJSR-133も知らないのか」と思っていたが、みんな
知ってて遊んでたのね。人が悪い。

320 :デフォルトの名無しさん:05/02/08 20:24:59
>>319
全員Cの話をしているものだとばっかり。


321 :デフォルトの名無しさん:05/02/08 20:26:43
>>317
書き直してみて
>>313
誰に質問してるかによるんじゃないの?

322 :デフォルトの名無しさん:05/02/08 20:58:06
>>307
WindowsにゃPTHREAD_MUTEX_INITIALIZERみたいなのがないからなぁ。
苦労するのはよくわかる。まぁ、、現実にはみなテキトーにやってるわけだがw

323 :デフォルトの名無しさん:05/02/08 21:13:21
>>307
漏れはヘルパクラスを作って静的変数(classのstaticメンバにすることが多い)の
コンストラクタとデストラクタでやってます。

複数のスレッドから、DLL等ダイナミックにローディングされるような状況(COM等)ではそれだと
上手くないので、DLL_PROCESS_ATTACH のタイミングでCRITICAL_SECTIONを初期化し、
開放はしないという方針(DLL_PROCESS_DETACHでDeleteCriticalSectionはGPF出ることがある)。
Mutex使えば簡単なんだけど、重いからなぁ・・・

324 :デフォルトの名無しさん:05/02/08 21:20:20
> 静的変数(classのstaticメンバにすることが多い)
初期化順の問題がおきそうですね。

あと、Windowsってmain関数が走る前にマルチスレッド状態ってことはあるんですか?



325 :デフォルトの名無しさん:05/02/08 21:29:56
>>324
初期化順の問題が出てくるようなコードの場合には、DllMainで処理するより他ないでしょうね。

>あと、Windowsってmain関数が走る前にマルチスレッド状態ってことはあるんですか?
そういうプログラムを作るか、他プロセスからフック等で介入するかすれば。

326 :デフォルトの名無しさん:05/02/08 22:11:01
J・S・R! J・S・R!


327 :デフォルトの名無しさん:05/02/08 22:37:22
ま、マルチスレッドといえばJavaの話題と考えるのが自然なわけだが。

328 :デフォルトの名無しさん:05/02/08 22:54:02
>>327
ば、ばかな。

329 :デフォルトの名無しさん:05/02/09 00:05:46
複数枚CPUのささったサーバ等で、Javaでマルチスレッド化
されたアプリを動かしたとき、そのアプリ内でたてるスレッドって
それぞれ別CPUが処理してくれるのでしょうか?

いや、単純にスレッドをCPU分作れば複数枚のCPUパワーを
フルに使えるのか、それともシングルスレッドのアプリを複数
プロセス立ち上げた方がいいのかってところなんですが。
もちろん完全並列処理が可能だという前提で。



330 :デフォルトの名無しさん:05/02/09 00:12:36
VM次第。

331 :デフォルトの名無しさん:05/02/09 00:20:29
OSとJVMの実装による。
SunのJREとSolaris/Linux/Windowsなら基本的にはその通り。
並列度がどれくらい効くかはOS自身の成熟度にもよるけど。

あとはプロセスを別個に作るとかなりメモリが無駄に重複して
消費されるだろうとかGC的には逆に並列でスレッドが沢山走って
でかいプロセスだと負担がどうだろうとかその他のリソースの
制約はどうだろうとかあるけど。


332 :PHP:05/02/09 01:46:55
HTMLのセレクトボックスの項目をデータベースから持ってきた値にしたいんですけどうまくいきません。
どうしたらいいんでしょうか?
真剣にだれか教えてください

333 :デフォルトの名無しさん:05/02/09 01:51:03
>>332
WebProg板でやれよ

334 :329:05/02/09 02:02:18
ありがとう。
なんスレッドくらいがよいのか試してみます。


335 :デフォルトの名無しさん:05/02/09 10:11:01
>>327
こっちだろ
http://www.divakk.co.jp/blog/aoyagi/archive/2004/07/16/546.aspx

336 :307:05/02/09 10:34:15
いい感じの内容の論文(なのかな?テクニカルレポート?)でした.
内容をちょっとだけ紹介します.

Singletonクラスのインターフェースが次のように定義されていたとします.

class Singleton {
public:
  static Singleton* instance();
  ...
private:
  static Singleton* pInstance;
};

本当はいろいろな場合わけがなされているのですが,ここでは,
Double-Checked Locking Pattern(DCLP)としてのinstanceメソッドの(まずい)実装例を取り上げてみます.

Singleton* Singleton::instance() {
  if (pInstance == 0) { // 1st test
    Lock lock;
    if (pInstance == 0) { // 2nd test
      pInstance = new Singleton;
    }
  }
  return pInstance;
}

これが何故まずいのかというと,
pInstance = new Singleton;
この一文がアトミックに行えないことにその原因があります.
【次へつづく】


337 :307:05/02/09 10:35:37
本文では上記コードを下記の等価なコードに置き換えて説明しています(Step1〜3の順番がややこしくなっていから注意して).

Singleton* Singleton::instance() {
  if (pInstance == 0) {
    Lock lock;
    if (pInstance == 0) {
      pInstance = // Step 3
        operator new(sizeof(Singleton)); // Step 1
      new (pInstance) Singleton; // Step 2
    }
  }
  return pInstance;
}

で,どんな問題が起きるかというと,

1.Step2のコンストラクタが例外を投げた場合,pInstanceにはoperator newでアロケートした領域のアドレスが代入されたままになります.
  さらに,コンストラクタが例外を投げたときは,operator deleteが呼ばれてしまうので,pInstanceにはフリーストアに戻ってしまった記憶領域のアドレスが保持されていることになります.


2.Thread Aがinstanceの中に入ってif文を通過しロックを取得し,Step3とStep1 を実行したとします.そしてThread Aがサスペンドしたとします.
  pInstanceにはnullではないポインターが保持されていますが,コンストラクタはコールされていません.

  この状態でThread Bがinstanceの中に入ってきた場合,pInstanceはnon-nullですから,そのまま,pInstanceの値をリターンしてしまいます.
  何度もいうようですがコンストラクタはコールされていません.


正直,ここまで考えるか!と感心してしまいます.しかもこんなのが連続します.
Singletonクラスを設計するときにはとても役立ちそうです.

ありがとうございました.

338 :307(いまさらだけど):05/02/09 10:52:18
http://www.cuj.com/documents/s=7998/cujcexp1902alexandr/
で 285 的なvolatileの使用例があります.上記urlでは,最初に問題のあるコーディング例として,
class Gadget
{
public:
  void Wait()
  {
    while (!flag_)
    {
      Sleep(1000); // sleeps for 1000 milliseconds
    }
  }
  void Wakeup()
  {
    flag_ = true;
  }
  ...
private:
  bool flag_;
};

というコードが記述されています.そして,
So all you have to do to make Gadget's Wait/Wakeup combo work is to qualify flag_ appropriately:
class Gadget
{
public:
  ... as above ...
private:
  volatile bool flag_;
};

と,問題点が修正されます.でも,CPUが複数個の場合は,環境依存ということになりそうですね.

339 :デフォルトの名無しさん:05/02/09 11:14:00
>>338
フラグをヒントにするくらいなら問題ないんじゃね?
終われそうなら終わってくれって程度で。

340 :デフォルトの名無しさん:05/02/09 11:59:08
ああ...確かに.個々のCPUのキャッシュが...どうのこうの考えたのですが,
仮にメモリの内容の同期が遅れてループが多少何回か多めに回転しても,この場合は無問題ですね.

341 :デフォルトの名無しさん:05/02/09 14:32:29
>>339
いいかもね。

俺のチームからはクビにするけど。

342 :デフォルトの名無しさん:05/02/09 14:37:16
>>341
お前のチームで一緒にやりたくねーよwwww

343 :デフォルトの名無しさん:05/02/09 14:40:03
結局>>246はどうですか?
>>250さんが言っているように
volatileにしとけば完璧ですか?

344 :デフォルトの名無しさん:05/02/09 14:45:03
>>343
そうだ。その通りだ。わかったらクソして寝てろ。

345 :デフォルトの名無しさん:05/02/09 15:04:29
ときどき聞くけどvolatileなに?
温めるの

346 :デフォルトの名無しさん:05/02/09 15:09:08
>>345
そうだ。その通りだ。わかったらクソして寝てろ。

347 :デフォルトの名無しさん:05/02/09 19:09:54
volatileとマルチスレッドは全く関係ないんだってば

348 :デフォルトの名無しさん:05/02/09 19:22:33
>>347
そうだ。その通りだ。わ(ry

349 :デフォルトの名無しさん:05/02/09 21:15:19
>342
wの多さは知能の低さ
>343
スレッドが死んだりすることはない。volatileで他スレッドの変更を
いつの日か読めるかどうかは環境依存。何度もいうが規格で規定され
ていない(C++)か未定義とされている(POSIX)ことに結論を求めては
いけない。ロック汁。

まぁ釣りなんだろうけどクマー


350 :デフォルトの名無しさん:05/02/09 21:35:52
>>349
Javaは?

351 :339:05/02/09 21:57:17
>>349
規格厨ですか?

Sleep()で寝てもいるのにvolatileなフラグの変更を
いつまで経っても読み取れない処理系挙げてみろよ。

なんでヒントって書いたかわかってないだろ?

352 :デフォルトの名無しさん:05/02/09 21:58:14
Alpha

353 :デフォルトの名無しさん:05/02/09 22:08:34
>>351
> なんでヒントって書いたかわかってないだろ?
なんで条件変数とかEventオブジェクト使わないの?



354 :デフォルトの名無しさん:05/02/09 22:09:25
>>350
JSR厨の光臨を待て!


355 :デフォルトの名無しさん:05/02/09 22:10:22
>>351
己の無知を棚に上げて人を規格厨呼ばわりするのはやめておけ。

356 :351:05/02/09 22:14:07
>>355
ふぅん。なら問題の出る処理系挙げてみ?
ここって規格の話をするスレだっけ?

357 :デフォルトの名無しさん:05/02/09 22:23:53
Alpha

358 :351:05/02/09 22:28:14
>>353
想定したのはProducer/ConsumerのConsumer側スレッドプールの
スレッド数を縮小させる場合などで、ターゲットのスレッドに対して
適当なタイミングで終了させるフラグを実装するような場合。

キューから引っ張ってきたタスクを実行中に止められるはずもなく、
その次のループで確実に終了する必要もない。

この条件でもフラグ見るのに絶対に同期する必要がある?

359 :デフォルトの名無しさん:05/02/09 22:28:49
>>356
池沼が根拠の無い嘘を書き散らす場所でないことだけは確か

360 :デフォルトの名無しさん:05/02/09 22:37:30
351は出荷済みのコードのことを思い出してガクブルしていて
誰かに問題ない!と言ってもらいたいんだろうな。
OSとCPUとコンパイラくらい書けばいいのに。

361 :デフォルトの名無しさん:05/02/09 22:54:05
volatileとマルチスレッドは無関係

362 :351:05/02/09 22:59:12
んにゃ。別に。

同期しときゃ済む話だし、省いたところでパフォーマンスが特に
上がるわけでもないからどうでもいい。

だけど、更新のある変数を扱う時は*絶*対*に*同期しなきゃ
いけないような論調になってるのが気に食わなかっただけ。

普通はフラグだけで完結するようなものはなくて、厳密な整合性を
必要とする操作のところで同期取ってるはずだから、結局はそこが
Memory Synchronizationになってるから問題ないでしょ?ってことさ。

だから問題がある処理系があるなら、それを挙げろ、と。

363 :デフォルトの名無しさん:05/02/09 23:09:31
横から失礼。

お前がコード貼って、みんなの環境でコンパイルして逆汗して、それをメモリモデルを考慮しながら検証するしかないだろうな。
俺は嫌だけど。

364 :デフォルトの名無しさん:05/02/10 00:37:25
>>349
> volatileで他スレッドの変更を
> いつの日か読めるかどうかは環境依存。

1 thread内なら、sequence pointは越えないんだけどね。

http://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gcc/volatiles.html

365 :デフォルトの名無しさん:05/02/10 00:37:57
>>351
C/C++なら、プログラミング言語の処理系レベルの問題ではなく、
アーキテクチャレベルの問題なんだが、それがわかってないようだな。

366 :デフォルトの名無しさん:05/02/10 00:42:17
だからさ、問題のおこる実例を出せって言ってるんだよ。
バカはこれだから困る。

367 :デフォルトの名無しさん:05/02/10 00:53:34
>>366
変数が扱えなくてリンゴとミカンでしか考えられない小学生みたいですね。


368 :デフォルトの名無しさん:05/02/10 00:56:24
>>366
おまいさんの質問に対して、もう二度も例が挙がってる。
それに気付いてない時点で、無知を曝け出しているのだよ。

369 :デフォルトの名無しさん:05/02/10 01:54:59
では、volatileラヴな皆さんへの問題。

// 初期値はともに0とする。
volatile int a = 0;
volatile int b = 0;

int threadA() {
int x;
a = 1;
x = b;
return x;
}

int threadB() {
int x;
b = 1;
x = a;
return x;
}


370 :369:05/02/10 01:55:31
上のようなC/C++のコードがあったとして、
SMP構成のPentium4マシン(HT機能はoff)上で
threadA(), threadB()をそれぞれ別スレッドから同時に呼び出したとする。

このとき「threadA()とthreadB()がともに0を返す」ようなことが起こり得るか?
起こり得る(起こり得ない)なら、その理由は?


次に、同じプログラムをUP構成だがHT機能を有効にしたPentium4マシンで
動かした場合はどうなるか?


# とりあえず、C/C++コンパイラはgcc 3.xとする。
# (VCでも同じ答えになるはずだが。)


371 :デフォルトの名無しさん:05/02/10 02:03:47
ようやく楽しげになってきたのでage


372 :デフォルトの名無しさん:05/02/10 02:08:20
うーん、過去ログなどは見てないで書くけど。

>>369はvolatileかどうかに関わらず、どちらが先に実行されるかって問題だけな気がする。
volatileがマルチスレッドに使えるとしている人たちの論拠は、緩やかな同期を取る話であって、
>369みたいなクリティカルな実行順序まで期待しての話じゃないと思うのだけど。
#わーい、自分でも何が言いたいのか判らんぞ

373 :デフォルトの名無しさん:05/02/10 02:20:37
> SMP構成のPentium4

ハァ?バカか?
んなもん存在しねーよ。
これだからバカは困る。

374 :デフォルトの名無しさん:05/02/10 02:32:31
Pentium4/Xeon

375 :デフォルトの名無しさん:05/02/10 02:35:01
351よ・・・もういい、頼むからもう安らかに眠ってくれ
消えろ。



376 :デフォルトの名無しさん:05/02/10 06:34:07
なんかボラタイルが自動的に同期をとるようにコンパイラに指定する
ものだと思ってるってことになっちゃってない?

377 :デフォルトの名無しさん:05/02/10 07:59:02
>>376
そういうレベルの話はとっくに片付いてる。
雑音も多いけど珍しくまともな議論になっていると思うよ。

378 :デフォルトの名無しさん:05/02/10 09:17:32
ぼらたれば

379 :デフォルトの名無しさん:05/02/10 09:22:31
>>369
volatileで修飾されいるとき、
変数の宣言とreturn文の間の2文の実行順序って気まぐれに変化するんだっけ?
何気に回答になっていなくてすまん。

380 :デフォルトの名無しさん:05/02/10 10:58:56
しまった。x はvolatileでなかったのね。

381 :デフォルトの名無しさん:05/02/10 11:22:15
誰もコンパイルしないな
ここはコンパイラももってないリア工房のスレだったのか。


382 :デフォルトの名無しさん:05/02/10 11:25:02
環境依存だからコンパイルして動かした所で意味無いしね

383 :デフォルトの名無しさん:05/02/10 11:28:54
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪なんてありきたりなんでしょうね♪
誰もが皆、一瞬つけてみたくなる発想のレスです♪
しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、
こういうレスは控えます♪しかし、この人はしてしまったのです(^^;
「誰もが思い付くような事」を堂々と♪
この人にとってこのレスは何なのでしょうか♪
このレスをしている間にも時間は刻々と 過ぎ去っているのです♪
正にこの人のした事は「無意味」「無駄」でしかありません♪ああ・・・何ていう事でしょう(^^;ワラ
図星で泣いちゃうかも(^^;ワラ


384 :351:05/02/10 11:31:51
>>368
今のところ、Singletonで確実に一度しか実行されないことを保証するのに
volatileでは解決にならない、ってことは結論出てるけど、決定的な一貫性を
必要としない、falseがtrueに変化するだけのフラグに使用することに関しては
まだ話題に上がってないと思うんだけど。

385 :デフォルトの名無しさん:05/02/10 11:36:25
>>382
threadの書き方もしらねーじゃねーの( ´,_ゝ`)
VBかDelphiでスレッドかいてるのがバレバレ

386 :デフォルトの名無しさん:05/02/10 12:11:59
a= 1 と x = b の間には依存関係はないから、OoOをサポートした大抵のCPUで
実行される順序は保証されないんじゃないかなー。
Pen4のOoOの仕様についての質問なら多少スレ違いじゃないか?

387 :デフォルトの名無しさん:05/02/10 12:15:23
>>384
漏れ手元に環境ないからわからないんだけど、IA64でスレッド/CPUの対応を
固定にして実行させると、単に参照している側は永遠にキャッシュから幸せに
falseを読み出し続けるような気がする。

もちろんSleep(100)の間に、他スレッド・プロセスの実行によってキャッシュが
無効になる可能性は十分あるけど。

388 :デフォルトの名無しさん:05/02/10 12:16:36
ひとりごとなら駅の裏でアリを相手に言えばいい

389 :デフォルトの名無しさん:05/02/10 12:31:28
>>386
こういう負け惜しみ言うやつって
仕事じゃ使えないんだよな

390 :デフォルトの名無しさん:05/02/10 13:36:17
話の腰を折って申し訳が無い。面白そうなのでいろいろ試してみたいのですが、
キャッシュの影響でスレッド間で同期が取れない状況というのは
Pentium4のHTでも起きるのでしょうか?物理的には1CPUだから無理なのでしょうか?

391 :351:05/02/10 19:49:51
>>387
Coherent Cacheだから無問題。
一貫性が崩れるのは他のCPUに伝わるまでのわずかな時間だけ。

さすがにそうじゃないアーキテクチャの場合(あるのか知らないけど)は
重要な前提が崩れるわけで、他でも悲惨なことになるんだろうね。

>もちろんSleep(100)の間に、他スレッド・プロセスの実行によってキャッシュが
>無効になる可能性は十分あるけど。

これは十分というより確実にあるでしょ。CPUがスレッド数より多く、さらに
その場合はOS側でコンテキストスイッチを行わないような実装になって
いればありえるかもしれないけど、そんなの現実的じゃないし。

で、SingletonのDCLの場合は、ひらたく言えば、ある変数の読み取りと
書き込み(+比較)を、必ずしも同期なしでAtomicに行うことができるか?
という命題と捉えていいと思う。

今のフラグの話題に戻ると、DCL問題ほど制約は厳しくなくて、読み取る
タイミングは必ずしも正確である必要はなく、書き込み側では読み取りは
一切無く、1ビット(Cだと1ビットでも立ってればtrue扱い)の書き込みのみ。
Reorderされようが、最終的に1ビット立ってりゃいいだけってこと。

volatileがなければ、ループ前に最適化でレジスタにキャッシュされて、
そのまま永遠に回し続けられる可能性も否定できなくなる。

これでも*絶*対*に*同期しなきゃいけないんだろうか?

392 :デフォルトの名無しさん:05/02/10 21:56:55
同期しなくてもいい場合を一生懸命探しているスレはここですか?

393 :デフォルトの名無しさん:05/02/10 23:37:13
synchronization eliminationは非常にメジャーな研究テーマです。

394 :デフォルトの名無しさん:05/02/10 23:52:48
もともと、同期しなくてもいい場合なんて探すまでもないでしょう。
>>392 はそこいらじゅう同期オブジェクトだらけのプログラムでも作ってるのでしょうか?


395 :デフォルトの名無しさん:05/02/11 09:05:15
メインスレッドでやるとウィンドウが白くなって、(応答なし)って
出るような場面だけマルチスレッドにすればいいんだよな?

396 :デフォルトの名無しさん:05/02/11 09:59:35
基本的にはスレッドにできる死したほうがいいのはすべてスレッドにしてます明日が何か?

397 :デフォルトの名無しさん:05/02/11 11:14:01
>>396
同期できてないんじゃないか?なんか出力がおかしいぞ。

398 :デフォルトの名無しさん:05/02/11 11:21:48
ハァ?volatile宣言しているから*問題ない*はずですが?

399 :デフォルトの名無しさん:05/02/11 11:26:59
>>397
おもしろい。というのはさておき、

>>391
Windowsしかも1CPUの環境でしか、マルチスレッドプログラミングしたことないヘタレだけど、
>>338 的なことはフツーにやってんだけど、やっちゃいけないことってされてたの?
危ない橋を渡ってたんだろうか?
オレは単純だから>>338 みたいなコードが無限ループみたいになるんだったら、volatileの存在意義なんてないって思ってたんだけど...
間違い?(とされてたのか?)
だれかホントのことを教えてくれ。むちゃくちゃ気になる。

400 :デフォルトの名無しさん:05/02/11 11:34:51
>>399
もっぺんスレを最初から読め

401 :デフォルトの名無しさん:05/02/11 11:54:39
すまん。最新100ぐらいしか読んでなかった

ところで,338>>で既出の
http://www.cuj.com/documents/s=7998/cujcexp1902alexandr/
ってC/C++ Users Journalなのな。しかも書いてる人がAndrei Alexandrescu !
ヘタレなおれには心強い

とにかく最初から読んでみるよ

402 :369:05/02/11 12:22:17
>>386
「OoOだから保証されない」じゃちょっと不十分かな。
「どういうメモリ操作が」OoOで実行されるかってことまで突っ込んで欲しかった。

>369のコードで「threadA()とthreadB()がともに0を返すことが起こり得ない」ためには
どういうmemory orderingが要求されるか、ってのは重要。
あるアーキテクチャでは、Double-Checked Lockingは正しく動作するが
Dekker's Algorithmは動かない、それは何故か。なんて話にも繋がる。

少なくともこの程度は意識できていないと、規格厨には対抗できんぞ。

403 :デフォルトの名無しさん:05/02/11 12:34:30
すまんせん、OoOってなんでしょうか。
ググってみたが関係しそうなのが見つからなかったっす。

404 :ジャムおじさん:05/02/11 12:38:41
OpenOffice.org

405 :デフォルトの名無しさん:05/02/11 12:41:21
「OoOだから保証されない」正解者全員プレゼント

クイズに当たると最高100万円等が正解者全員に当たる!
1問コース 小物、アクセサリー 2問 鞄、雑貨、
3問 指輪、アウトドア  5問 商品券、家電、食品
6問、ゲームボーイアドバンス、折りたたみ自転車等
10問 PS2、2万円、サイバーショット、GQ、ブランド物等
15問 10万円、VAIO U、ビデオカメラ
20問 30万円、VAIO QR、VAIO W 25問 100万円

406 :ジャムおじさん:05/02/11 12:42:54
>>405
賞品にママの手づくりジャムが入ってないよ〜

407 :デフォルトの名無しさん:05/02/11 12:46:44
>>403
雑音はおいといて、Out of Orderの略。

408 :デフォルトの名無しさん:05/02/11 13:16:19
とにかく、volatileって書いておけば、マルチスレッドでも大丈夫、ということ。

409 :デフォルトの名無しさん:05/02/11 13:25:52
釣られないぞ。

410 :デフォルトの名無しさん:05/02/11 13:41:08
スレ全体の流れとしては、

当初は、>>338のようなコードはダメの典型(必ず同期を取る必要がある)とされてきたけど、
今は、>>339, >>340のいうような緩やかな同期というか成り行き任せの同期が
許される状況では >>338 のようなコードも選択肢のうちに入れてよいのでは?

ってことになってるってことでOK?

そして、C/C++ Users Journalの記事に反論できる猛者の出現を待っていると...

411 :デフォルトの名無しさん:05/02/11 13:41:58
>>402
write → readがout of order実行されるとダメってことですかね。
例えばIA32だとこういう操作がout of order実行される、とかってどこかに書いてあるの?


412 :デフォルトの名無しさん:05/02/11 13:45:25
>>410
> 今は、>>339, >>340のいうような緩やかな同期というか成り行き任せの同期が
> 許される状況では >>338 のようなコードも選択肢のうちに入れてよいのでは?

同期というより、なおかつ変更があった直後に気付くという保証が不要で、
そのうち気がつけばいいやという程度なら、ですね。


413 :デフォルトの名無しさん:05/02/11 13:46:13
×変更があった直後に気付く
○変更があった後の最初のチェックで気付く


414 :410:05/02/11 13:49:34
>>412, >>413
あっそうか...
この場合は「同期」という言葉は不適切だね。
修正ありがとう。

415 :410:05/02/11 14:23:00
あ... っていうより、もともと同期を必要としていない状況なのにもかかわらず、
「何で同期しないんだ!」ってことになってたからおかしくなってたんだ...

416 :410:05/02/11 14:26:51
補足。
もちろん、同期を必要としない状況下で同期しても害はないね。

417 :デフォルトの名無しさん:05/02/11 14:41:03
ここはお前の日記帳じゃあねえんだ
チラシの裏にでも書いてろ

418 :デフォルトの名無しさん:05/02/11 15:15:09
>>417
いまここに必要とされている人は、C/C++ Users Journalの記事に対して反論できるほどの識者であり、
もはや,あなたのようにノイズを撒き散らすだけがとりえの人間の居場所はありません。
より正確には、あなたの存在自体がノイズです。
ノイズはノイズらしく消えてください。

419 :デフォルトの名無しさん:05/02/11 15:35:12
っていうか、volatile最強じゃね?

420 :デフォルトの名無しさん:05/02/11 15:46:40
と無限ループで夜は更けていく

421 :デフォルトの名無しさん:05/02/11 16:07:52
>>420
もう更けるのかよ!
北極圏にお住まいなのかよ!

422 :デフォルトの名無しさん:05/02/11 16:24:04
volatileで>>338のようなコードの無限ループ化は防げますが、
2ちゃんねるの議論の無限ループ化は防げません。

ってことでOK?

423 :デフォルトの名無しさん:05/02/11 17:20:45
volatile厨厨完全に沈黙wwwwwwww

424 :デフォルトの名無しさん:05/02/11 17:28:38
VHDLならいつもぱられリズム

425 :デフォルトの名無しさん:05/02/11 23:59:13
volatileカワイイヨvolatile

426 :デフォルトの名無しさん:05/02/12 00:50:39
volatileを恐れなく使う兵達のスレ
でも立てるか

427 :デフォルトの名無しさん:05/02/12 03:55:28
このスレの住人のSMPなマシンの保有率を調べてみたい

428 :デフォルトの名無しさん:05/02/12 07:09:05
なんか良く判らないけどDUAL CPU用のトリップ検索ソフト作って。

429 :デフォルトの名無しさん:05/02/12 11:26:06
仕事じゃ4 way, 8 way, さらには16 wayなんてマシンも扱っていますが、何か?

430 :デフォルトの名無しさん:05/02/12 11:28:59
プ

431 :デフォルトの名無しさん:05/02/12 14:31:29
情報処理試験(エンベデッド)の問題について教えてください。

セマフォの記述として、適切なものはどれか。
ア P操作待ちのタスクはキューで管理される。
イ V操作待ちのタスクはキューで管理される。
ウ デッドロックの心配がない排他制御の手段である。
エ 排他制御の目的以外には使用できない。
          (平成10年度 ES 午後 問32)

正解がアかイかでちょっとだけ揉めています。どちらが正しいと思いますか?

432 :デフォルトの名無しさん:05/02/12 15:43:04
>>431
調べりゃ分かるが、確保するのがPで返却がV
queue使うのはP操作待ちの方だな

433 :デフォルトの名無しさん:05/02/12 17:30:11
オランダ語が由来だっけ?
それにしてもあまり出来のいい問題じゃないと思うなあ。


434 :デフォルトの名無しさん:05/02/12 18:33:52
>>432 セマフォの返却を待つタスクが並ぶキューというのはないのですか?

435 :デフォルトの名無しさん:05/02/12 18:48:35
それがP操作の九だって・・・・・(´・ω・`)

436 :デフォルトの名無しさん:05/02/12 19:13:25
そのキューではV操作を待っているんですよね?

437 :デフォルトの名無しさん:05/02/12 20:28:19

  ||ヽn/|, --- 、
  |i/^r     ヘ、
 く, '/彡 (ノノ))))i|  待ちタスク管理したいな
  |N ミ| | ┃ ┃ | |
  | lヽ| | ''' ヮ''ノi |     ______
  | | ⊂}|i † i|{つロ  / ロ ロ ロ  /
  Vy と.l_/_|_j_〉  / ロ ロ ロ  /
             ̄ ̄ ̄ ̄ ̄ ̄


438 :デフォルトの名無しさん:05/02/12 21:53:49
ダレダ、オマエハダr(ry

439 :369:05/02/13 02:28:27
>>411
> 例えばIA32だとこういう操作がout of order実行される、とかってどこかに書いてあるの?
そりゃ、"IA-32 Intel Architecture Software Developer's Manual"で決まりでしょ。
ttp://www.intel.com/design/pentium4/manuals/index_new.htm
とりあえず、Volume 3の"7.2. MEMORY ORDERING"以降は必読。

440 :411:05/02/13 03:06:40
ほんとだ。
見たはずなのに気づいてなかった。
とりあえず読んでみます。


441 :デフォルトの名無しさん:05/02/13 09:00:34
>>432
お前は知識は申し分ないが、日本語の能力に問題がある。

442 :デフォルトの名無しさん:05/02/13 14:58:10
>>336にあるようなDCLP実装ですけど、次のような方法はどうでしょう?

Singleton* Singleton::instance() {
if (pInstance == 0) {
Lock lock1;
if (pInstance == 0) {
Singletom* volatile temp;
{
Lock lock2;
temp = new Singleton;
}
pInstance = temp;
}
}
return pInstance;
}

上のコードは、Lockの確保/解放をまたいでコードが移動しないことを前提としています。
Lockの用途を考えるとLockの外側にコードが移動することはないと思いますが、
Lockの内側にコードが移動することがあるのかどうかが不明です。


443 :351=339:05/02/13 23:20:36
>>442
散々既出。(・∀・)カエレ!!
これだからvolatile厨は・・・。

444 :デフォルトの名無しさん:05/02/13 23:48:02
>>442
> 上のコードは、Lockの確保/解放をまたいでコードが移動しないことを前提としています。
> Lockの用途を考えるとLockの外側にコードが移動することはないと思いますが、

それって言えるの? 少なくともセマンティクス上はロックだなんてコンパイラは
関知しないから普通にありえるんじゃないの?

> Lockの内側にコードが移動することがあるのかどうかが不明です。

lockだと認識してもありえるんじゃないの?
Javaのsynchronizedもこれはありえたと思う。


445 :442:05/02/14 01:23:47
>>444
> それって言えるの? 少なくともセマンティクス上はロックだなんてコンパイラは
> 関知しないから普通にありえるんじゃないの?

確かにそうなんですが、これが保証されてないとロックは使い物になりません。
コンパイラを限定するか、普通のコンパイラであれば問題ないように
実装されているのだと想像しますが、ライブラリのスペックとして
どのように決まっているのかを知りたかったのです。

> Javaのsynchronizedもこれはありえたと思う。

おっしゃるとおり、Javaではありです。
C/C++(あるいはC上でのライブラリ)ではどうなのか、ということです。


446 :デフォルトの名無しさん:05/02/14 06:21:32
>>442
そのコードはともかくとして、
http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
により、アドバンストなDCLPの実装があるよ。
でも、マルチCPUの場合は適切にメモリバリアを挿入してない、
DCLPはダメ(あらゆるマルチCPUな環境でダメというわけではないと思うが)
ってことになってるよ。

447 :442:05/02/14 23:36:55
>>446
読みました。
>>442のコードは2つほど問題があるようです。

1つ目。
new SingletonがpInstance = tempよりも前に実行される必要があるが、
これは必ずしも保証されません。
ロックが完全同期をとるメモリバリアの場合や、
メモリモデルがTSOのようにwrite→writeの順序が逆転しなければ
問題なさそうです。
しかし、acquire/release型のメモリバリア(release consistencyというのかな?)の場合
release後の読み書きは同期されないため、write順が逆転すると意図通りになりません。

2つ目。
Singleton::instance()で取得したオブジェクトを読み書きするときの例として以下のコードを考えます。
SIngleton* p = Singleton::instance();
p->x;
もしメモリモデルが(Pentium4のように)read→read順序が保証されないものだったとすると、
p->xがpの代入より前に行われる可能性があります。
(ただp->xはpに依存しますので、実際には順序が入れ替わることはないような気もします)

特定の環境では動きそうですが、確かにポータブルな書き方はなさそうですね。
どうもありがとうございました。


448 :デフォルトの名無しさん:05/02/14 23:54:06
> p->xがpの代入より前に行われる可能性があります。

そりゃいくらなんでも...

449 :デフォルトの名無しさん:05/02/15 09:01:53
ヴォラヴォラヴォラヴォラァァー


450 :デフォルトの名無しさん:05/02/19 10:17:34
volage

451 :デフォルトの名無しさん:05/03/01 22:39:56
Win32でブロックしているスレッドのブロックを解除する方法ってないのかな?
具体的にはReadFileでブロックしているのを特定の時に解除したいんだけど、
TerminateThreadでスレッドをヌッ殺すのはあんまり良くない見たいだし。
オーバーラップi/oにして、WaitForMultipleObjectsあたりで、ほかのイベントも
受けられるようにしとくしかないのかな。

452 :デフォルトの名無しさん:05/03/01 23:16:19
>>451
CloseHandle()したら強制エラーリターンしないだろうか。
・・・すまん、試してないので真偽は不明。

453 :デフォルトの名無しさん:05/03/02 00:29:18
>>451
Overlappedが正解だろ。

454 :デフォルトの名無しさん:05/03/02 20:54:06
>>452
それはやってみたけど駄目でした。CloseHandleした他のスレッドまでブロックして
戻らなくなってしまいましたよ。
ソケットのハンドルならcloseするとrecvがエラーリターンするからもしやと思って
試してみたんだけどね。

>>453
やっぱ重複i/oですか。UNIX(solaris)で使ってたコードを移植してるんだけど、
UNIXだとシグナルでブロックを中断させてるから似たようなことできないかなぁ
と思ったもんで。重複i/oにしときます。

でもだとすると、同期i/oつかったアプリってブロックを解除する手立てがないとすると、
ウィンドウの×ボタン押されたときってどうやって終了すればいいんだろ?
別スレッドからTerminateThreadとかExitProcessとか乱暴な方法しかないような
気がするけど。それともコンソールアプリでしか使うなって事なのかな。

455 :デフォルトの名無しさん:05/03/03 00:08:50
>>454
×ボタンだとWM_CLOSEが飛んで来て普通は終わる。無視するのも自由。
無視して動き続けるとタスクマネージャからユーザーに止められる。
シャットダウン中だと暫く待って強制終了。

使われるのはおそらくTerminateProcessかその類似品。

TerminateThreadして動き続けるのはゴミ残るから(・A ・)イクナイ!けど、
ExitProcessはプロセス間で共有するリソースを使ってるような場合を
除いて問題なし。大半のリソースはプロセスと共に解放される。

456 :デフォルトの名無しさん:05/03/03 02:36:02
Windowsのsignalってどういう設計なんでしょうか。
スレッドではなく、純粋な割り込みと考えてよいのかな?

457 :デフォルトの名無しさん:05/03/03 02:36:31
いんや

458 :デフォルトの名無しさん:05/03/03 02:49:37
Windows に signal なんて無かったと思うけど・・・

459 :デフォルトの名無しさん:05/03/03 07:38:08
CRT/src/WINSIG.c 嫁。

460 :デフォルトの名無しさん:05/03/04 22:21:07
>>455
WM_CLOSEが飛んで来たとき、何とかしてサブスレッドのブロックを解除後、
サブスレッドを終了。

メインスレッドでWaitFor何がしObjectでサブスレッドが終了するまで待機後、
サブスレッドのハンドルをクローズ。その他諸々のハンドルを閉じてプロセス
終了へ。と言う風に思ってたんだけど

終了時ならそんなにムキになって後始末しなくていいんだ。

461 :デフォルトの名無しさん:05/03/06 23:41:01
俺様専用チラシの裏

少し前に「Windowsではmutexの静的な初期化が出来ない」という
話があったような気がするが
実際に必要になりそうなケースに遭遇したので、解決法の案。
(double-checked lockingなのは趣味だから気にするな)

static data_t *data;
 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
 pthread_mutex_lock(&mutex);
 if (!data)
  data = get_initial_data();
 pthread_mutex_unlock(&mutex);

pthreadでは↑のように行う処理を、Windowsでやりたい。
 CRITICAL_SECTION *csection;
 if (!csection) {
  CRITICAL_SECTION *p = new CRITICAL_SECTION;
  InitializeCriticalSection(p);
  InterlockedCompareExchangePointer(&csection, p, NULL);
  if (csection != p) {
   // 解放部は場合によっては不要だと思われる
   DeleteCriticalSection(p);
   delete p;
  }
 }
 EnterCriticalSection(csection);
 以下略
面倒ではあるが、こんな感じで正常に動くと思うのだが、どうだろうか。

462 :デフォルトの名無しさん:05/03/08 15:28:58
環境:
WinXP Pro
VC++ 6.0

マルチスレッドのサーバプログラムを作りたいと思っているのですが、
参考になるようなHP又はアドバイス等ありましたらご教授願います。
サーバの処理内容は、SQLDBに接続して処理結果を
クライアントに返すというものです。

463 :デフォルトの名無しさん:05/03/09 02:21:10
>>462
自前でマルチスレッドサーバプロセスを作るのは面倒なので、COMコ
ンポーネントを作ってCOM+に登録するというのはどうでしょうか。

スレッドやトランザクションの管理をお任せに出来るのが楽だと思
います。COMコンポーネントの作成に抵抗がなければですが……

464 :462:05/03/09 09:00:54
>>463
曖昧な質問に答えて頂いて有難うございます。
VC++はあまり弄った事がないので、
まずはCOM+について調べてみたいと思います。

465 :デフォルトの名無しさん:05/03/09 09:39:05
>>456
構造化例外の成れの果て
だったと思ったけど。

466 :デフォルトの名無しさん:05/03/09 23:39:05
>>465
だな。準拠のためのやっつけ仕事。
な〜んの役にも立たんぞ。

467 :デフォルトの名無しさん:05/03/12 02:45:10
マルチスレッドって何?(main()もスレッドらしいけど)
どうやって作るのか教えて下さい。
そもそもその定義とは何ですか?

468 :467:05/03/12 02:47:10
環境は、VC++.net2003又は、bcc5.5です。

469 :デフォルトの名無しさん:05/03/12 14:37:30
beginthreadex関数のサンプルを見ろ。
糞初心者が。

470 :デフォルトの名無しさん:05/03/15 05:37:07
pthreadとboostどちらが可搬性がありますか?

471 :デフォルトの名無しさん:05/03/15 14:49:30
boostのthreadは、C++コンパイラが古い環境だと動かないだろ
自分でboostやg++をmakeする気持があればどっちも同じ。

472 :デフォルトの名無しさん:05/03/15 15:15:53
実際古いコンパイラが問題になることなんて無いと思うけどね。
新しくすればいい。

473 :デフォルトの名無しさん:05/03/15 22:52:31
>>470
boostはWindowsでも使える。
pthreadはWindows上では動かない。
そういう意味ではboostの方がポータブルだな。

・・・まあCygwin使えばpthreadも動くわけだが。


474 :471:05/03/16 00:17:52
>>473
それはちょっと知識が古いかな。

Pthread Support in Microsoft Windows Services for UNIX Version 3.5
http://www.microsoft.com/technet/interopmigration/unix/sfu/pthreads0.mspx

SFU 3.5はなぜ無償化されたのか
Services for UNIX最新版を無償化したマイクロソフトのマーケティング戦略
http://www.atmarkit.co.jp/fwin2k/insiderseye/20040319sfu35/sfu35.html

一時アメリカの政府機関の導入用件にPOSIX準拠であることを策定したので、
その流れでPOSIX対応じゃないと導入できないところがまだある。
C2 securityしかり。


475 :デフォルトの名無しさん:05/03/16 01:27:50
>>474
確かにNTにPOSIXサブシステムがあったのはそれが理由だが
SFUは違うというか普通にMacOSX対策じゃない?

476 :デフォルトの名無しさん:05/03/16 14:15:46
>>475
つかえねーPOSIXサブシステムは捨てたから、
POSIX互換が必要ならSFU使えって事でないの?


477 :デフォルトの名無しさん:05/03/16 14:22:49
>>476
導入用件をクリアさえすればいいだけで使えるようにする必要は無いんだから
わざわざ買収までしてSFUに切り替える理由がそれだけでは弱い

478 :デフォルトの名無しさん:05/03/16 15:30:26
使えないと要件クリアしません。

Citrix ターミナルサーバ、Interix SFUは、いい決断だったと思います。

479 :デフォルトの名無しさん:05/03/16 16:24:52
>>478
>>476-477が言ってる使えないと>>478の言ってる使えないのニュアンスは多分違う

480 :デフォルトの名無しさん:05/03/18 11:15:29
@/A-----------------------------------------
環境
WinXP Pro
VC++ 6.0

VC++でマルチスレッドを用いた複数端末通信プログラムを作っています。
端末との通信はできたのですが、プログラムが終了するときにメモリリークが発生してしまいます。

プログラム構成は以下の通りです。
MainApp : CWinApp (アプリケーション)
MainSock : CAsyncSocket (アプリケーションメインソケット)
SubThread : CWinThread (各端末毎の接続を担当するスレッド)
SubSock : CSocket (端末とのデータ送受信用ソケット)

MainApp::InitInstance(){
g_Sock = new MainSock(); // メインソケット生成
g_Sock->Listen(); // 接続要求待ち
}

MainSock::OnAccept(){
SubThread* pThread = (SubThread*)AfxBeginThread()
スレッドにソケットを引き渡す
pThread->ResumeThread();
}

SubThread::InitInstance(){
m_SubSock.Attach( 渡されたソケット );
}

void SubSock::OnReceive(){
受信データの読み込み
}

481 :デフォルトの名無しさん:05/03/18 11:16:00
A/A-----------------------------------------
デバッグウィンドウのメッセージは以下の通りです。
Detected memory leaks!
Dumping objects ->
C:\Server\SubThread.cpp(17) :
{100} client block at 0x005F2F60, subtype 0, 140 bytes long.
a SubThread object at $005F2F60, 140 bytes long
Object dump complete.

SubThread.cpp(17)には、
IMPLEMENT_DYNCREATE(SubThread, CWinThread)
が記述してあります。

端末との接続用に生成したスレッドが終了していない事が原因と考えています。
スレッド内から AfxEndThread を呼べば終了できる事は確認していますが、
スレッドではSubSockオブジェクトを初期化しているだけで
Run()内でループ処理しているわけではないので、外部からフラグ等で終了させる事はできません。
外部から終了するにはどうすればいいのでしょうか?

482 :デフォルトの名無しさん:05/03/18 12:17:15
そういうスレッドの使い方はしない。

483 :480:05/03/18 12:46:33
ええっそうなんですか・・・
じゃあ、単純にソケットを複数個用意して、処理を割り当てればいいんですかね・・・?
何か参考になるHPとかあったら教えて頂けませんか?

484 :デフォルトの名無しさん:05/03/18 13:10:34
MFC ソケットでぐぐると一杯出てくるよ。
お好きなのをどうぞ。

マルチスレッドにするのならヒントとしては、
接続のためだけにワーカースレッドを用意して、
通信はメインスレッドに任せるっていう考え方よりも、
メインスレッド側で接続管理をして、
それぞれの通信管理をスレッドに任せる方が、
スマートだと思うけど。

485 :480:05/03/18 14:07:42
一応、メインスレッドで接続管理、サブスレッドでデータ通信になってます。

@メインスレッドでメインソケットをListenで待機
AメインソケットのOnAcceptでサブスレッドを生成、サブスレッドのメンバ変数にソケットを渡す
Bサブスレッドのソケットでデータ送受信
Cサブスレッドのソケットを閉じる

というところまではできたのですが、Aで生成したサブスレッドが終了できない、という状況です。

>MFC ソケットでぐぐると一杯出てくるよ。
散々ぐぐって色々見てみたんですが、ソースの一部しか載ってなかったり
プロジェクトの性質から使えなかったり、という感じだったので
足りない部分を自分で作ってみたらこんな感じになってしまいました。

486 :デフォルトの名無しさん:05/03/18 14:32:44
それは、4の後にAfxEndThreadなりでスレッドから抜けずに、
スレッドは生かしつづけたままって事?

通常はその流れなら、

@メインスレッドでメインソケットをListenで待機
AメインソケットのOnAcceptでサブスレッドを生成、サブスレッドのメンバ変数にソケットを渡す
Bサブスレッドのソケットでデータ送受信
Cサブスレッドのソケットを閉じる
Dサブスレッドから抜ける(スレッドの終了)

と言う様になると思うんだけど。

途中でスレッドを停止させるケースに対応したいっていうなら、
イベントカーネルオブジェクトなりで、メインスレッド<->サブスレッド間の
通知機構を実装しなきゃだと思う。

スレッドを生かしつづけてソケットだけを生成->割り当てとするなら、
スレッドプールの実装も考えた方がいい。

アプリケーションの終了時リークするのは、スレッドが停止していない状態で、
プロセスを終了しているからでは?
それならば、スレッドの終了をきちんと待ってからアプリは終了するべき。
スレッドの緊急停止は最終手段。




487 :480:05/03/18 14:56:13
>イベントカーネルオブジェクトなりで、メインスレッド<->サブスレッド間の
>通知機構を実装しなきゃだと思う。
VC++あまり弄った事がなくてソケットの部分だけ調べまくってやってたので、
存在を忘れていました。

今回はとりあえず動かなければどうしようもないので、
Run()の中ですぐSubSock.Receive()を呼んでデータを受信し、
ループ処理せずにAfxEndThread(0,true);で終了する、という方法でやる事にしました。

他にも色々いい方法があるようなので、今度調べてみたいと思います。
どうも有難うございました。


488 :デフォルトの名無しさん:05/03/18 14:59:13
Windowsのマルチスレッドプログラミングを本格的にやりたいのなら、
AdvancedWindows第4版は買っておいたほうがいいよ。


489 :デフォルトの名無しさん:05/03/18 15:01:14
>>487
AfxEndThread()で終了すると、そのスレッド内で実体化したクラスのデストラクタが呼ばれない。
なので、単にreturnする方がいい。

490 :480:05/03/18 15:18:32
有難うございます。読んでみます&試してみます。

491 :デフォルトの名無しさん:05/03/18 21:46:31
>488
どんなことが書いてある(その本でしか読めない)の?

492 :デフォルトの名無しさん:05/03/19 00:21:09
目次と内容は↓で分かるよ。
http://www.ascii.co.jp/pb/msp/38055/38055.htm

493 :デフォルトの名無しさん:05/03/19 00:59:08
なかなかよさそうですね
volatile

494 :デフォルトの名無しさん:05/03/19 03:48:54
asm volatile ( "breakc 0x0" );

495 :デフォルトの名無しさん:05/03/21 00:11:17
Linuxのシステムで、プロセスをまたいだファイルのアクセスをします。
オススメの排他制御は何ですか?
対象のシステムは、突然電源が落とされる可能性があるものとします。

496 :デフォルトの名無しさん:05/03/21 00:14:53
>>495
ありません

497 :デフォルトの名無しさん:05/03/21 00:25:59
>>495
プロセスをまたいだら、既にスレ違い (マルチスレッドじゃない)
だろ。fcntl(2) で F_SETLKW。
てゆうかAPUE(http://pc5.2ch.net/test/read.cgi/tech/1105723117/13)嫁。


498 :デフォルトの名無しさん:05/03/21 01:15:22
それもそうでした。(スレ違い)
ごめんなさい。

124 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)