マルチスレッドプログラミング相談室
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNG0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004無党派さん
NGNG0005デフォルトの名無しさん
NGNGコーディング目的は暇潰しです
0006デフォルトの名無しさん
NGNG暇つぶしなら自分で作れば?
0007デフォルトの名無しさん
NGNGっすねー・・。
0008デフォルトの名無しさん
NGNG語りたいならJavaやC#やるのが手っ取り早い。
環境依存ならWindowsが一番楽しいかも
0009無党派さん
NGNG> g++でマルチスレッドなプログラムを書くときにオススメのクラスライブラリありますか?
http://lin.fsid.cvut.cz/~kra/index.html#QpThreadとか。
ただ、libraryがmultithread-safeじゃないし、
ちなみに*BSDやLinuxは、pthreadがマトモじゃないから、
> プラットホームはUNIX全般、
は面倒。場合によっては不可能。
どこが準拠じゃないかはそれぞれのlibraryのREADMEを。
0010デフォルトの名無しさん
NGNGどういうのがありますか?
0011デフォルトの名無しさん
NGNGまさかLinuxの分けはないよね?
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNGhttp://www.shoeisha.com/book/Detail.asp?bid=9
http://g.oswego.edu/dl/cpj/
http://www.amazon.com/exec/obidos/ASIN/0201310090/103-8053412-8027047
漏れには難しすぎた・・・。
オライリーから出てるの買えばよかった・・・。
Concurrency: State Models & Java Programs
http://www-dse.doc.ic.ac.uk/concurrency/
http://www.amazon.com/exec/obidos/ASIN/0471987107/103-8053412-8027047
↑おもしろそう・・・。
0014デフォルトの名無しさん
NGNGFreeBSD3.xと、Linux2.0.xではLinuxの方がよかった。
IRIXもわりとしっかりしてた。
NetBSD、OpenBSDは全く知らん。
スレッドまわりは、OS・カーネル・ライブラリ(libcとか)での差が激しいので、
環境の違いが少ないWin32プラットホームが一番やりやすい。
0015デフォルトの名無しさん
NGNG001614
NGNGしては、使いづらい。
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNGInterlockedIncrement()はなんでガードしないと行けないんですか?
4バイトのインクリメントならアセンブラでincとかになるから、
ロックはいらない気がするんですが。
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNGたぶんX86以外のプラットホームで問題が起きるからでしょ。
X86ならメモリの値をインクリメントする命令があるけど
RISCはそんな複雑な命令なさそうだし。
winbase.hでもInterlockedIncrement()の定義の前は
---
#if (defined(_M_MRX000) || defined(_M_ALPHA) || (defined(_M_PPC) && (_MSC_VER >= 1000))) && !defined(RC_INVOKED)
---
ってなってるし。
0021デフォルトの名無しさん
NGNGunixだとスレッド使うよりpiped forkやIPC使ったほうがよさげな気がしませんか。
0022デフォルトの名無しさん
NGNGpthread_[gs]etspecificなんていちいちやってられないし…
0023デフォルトの名無しさん
NGNG仕方無くスレッドが発展したらしい>21
0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNG0026無党派さん
NGNG> ちなみにLinuxのcloneって関数、あれforkなんでしょ?
メモリ空間とか共有するリソースがあるfork。BSDのrforkに似ている。
で、threadは特殊なprocessだから、
signalのsemanticsがpthreadとちょっと違う。ただ違うのはここだけ。
linuxthreadsのREADMEより、
- Signal handling does not fully conform to the Posix standard,
due to the fact that threads are here distinct processes that can be
sent signals individually, so there's no notion of sending a signal
to "the" process (the collection of all threads).
More precisely, here is a summary of the standard requirements
and how they are met by the implementation:
(略)
*BSDよりはPOSIX conformance度は高い。
0027無党派さん
NGNG> 一番揃ってるのはwin32っぽいですね。
そんなことはない。スケジューラとか非常に貧弱。
POSIX 4相当(準拠でなくてもいいが)には全然足りない。
0028無党派さん
NGNG> 非Win32な環境でスレッドローカル変数を効率的に扱うにはどうすればいいでしょうか?
> pthread_[gs]etspecificなんていちいちやってられないし…
これは必要な時に使うもので、必要でなければ使わなければ良い。
どう利用するかによって、どうすればいいかは変わってくるから、
これ以上答えられない。
0029デフォルトの名無しさん
NGNGえ?それはぎゃくじゃない?
sys_cloneからdo_fork呼んでるように見えるけど。
arch/i386/kernel/process.cなんか見ると。
おれの勘違いだったらごめん
0030デフォルトの名無しさん
NGNGスケジューラって具体的に何を指してますか?
あと、POSIX4相当であれば十分、というのは何を根拠にしてます?
自分が必要だなーと思う基準ですが:
- 周辺ライブラリ(libc含む)がMT-safeかどうかを考慮されたもので構成されているか
- それらがOSからのサポートを受けているものか(ユーザーが作ったwrapperではなく)
- それらの情報が揃っているか
- 実際に役に立つライブラリがあるか(藁
というのを考えると、一番win32、時点SolalisもしくはJava じゃないですかね。
単一ベンダが OS、開発環境、アプリケーション作ってりゃ当たり前なんですけども。
OSオタクでなく、実際にアプリケーションを書いている人の意見を求めます。
003130
NGNGですねスミマセン
0032デフォルトの名無しさん
NGNGその本面白そうだね。
Javaやる人って必ずGoFやると思うんだけど、
あれやっても構造に関しては一応それらしいものが作れるようになりましたって
なるけど、Javaの利点の一つのクラスにスレッドを簡単に割り当てられる、
これをどう活用したらいいのか?これにはあんまり参考にならないんだよね。
買ってみるかな。評者の★の数が全部満点なのがなんか怪しいがw
0033デフォルトの名無しさん
NGNG読み込み→インクリメント→書き込みのフェーズになるから、SMPではロックし
ないと他のCPUと競合する可能性がある。NTじゃなきゃ起きないけど。
0034無党派さん
NGNG> あと、POSIX4相当であれば十分、というのは何を根拠にしてます?
そんな事言ってない。「一番揃っている」のはwin32じゃないと言っただけ。
Solaris 8はPOSIX 4をほとんど実装しているが、win32はそうではない。
>>21
> 一番揃ってるのはwin32っぽいですね。
という文章に対してさ。
それ(一番揃っている)を要件にすると、
> というのを考えると、一番win32、時点SolalisもしくはJava じゃないですかね。
一番Solaris、次点win32、その他、
Javaはplathomeによる(VMの完成度が違うので)、じゃないかな?
(MacOS X, AIX, Tru64などマイナー系は省いた)
> というのを考えると、
って言ってるけど、新しく要件作れば、そりゃどんな順序にでも出来るでしょ。
俺は>>21の「一番揃ってる」に対して言ってるんだよ。頼むぜ。わけが分からん。
そもそも発端の>>11の"freeの"からも外れていってるしさ。
> スケジューラって具体的に何を指してますか?
スケジューラですけど?
>>30以外関心ないかも知れないのでsage
0035デフォルトの名無しさん
NGNG0036デフォルトの名無しさん
NGNGBeOSはあるバージョンアップのときに、大きな変革をやらかしたおかげで
既存アプリが大打撃を食らったそうだ。Mediaなんとかだっけかな。
そういう意味での安定性も必要だと思う。
0037デフォルトの名無しさん
NGNGPOSIX準拠って何か役に立つの?
もしかして、すっげーくだんねえ話してる?
0038デフォルトの名無しさん
NGNGあるならおせーてくれ!
0039デフォルトの名無しさん
NGNGLinuxは、スレッドは実装してないんでは???
0040デフォルトの名無しさん
NGNG標準インターフェイスを目指してるのかもしれないから、
既存のOSが準拠すべきものではないのかも。
POSIXに準拠していようがしてなかろうが、最終的にはその
実装、性能でしょ。SMPに対するスケジューリングの効率。
沢山プロセッサの乗ったマシンなんて使ったことないから
分からないけどNTのスケジューリング悪くないらしいよ。
聞きかじりの話だからあてにならないけどさ。
0041無党派さん
NGNG必要ない人は、別に気にする必要ないんじゃないの?
必要ない人に話しても(゜Д゜)ハア?でしょ。
>>40
SMPのscaleだけ話してるわけだよね。
それだけが要件の人は、それだけ考えればいいんじゃないのかな?
それだけを要件にしてもSolaris>>NTだけどさ。
けど、スケジューラの機能ってそれだけじゃあないよ。(1CPUの時でさえ)
NTの場合は、まともなdatabse構築する場合には、
kernelのsource codeが必要になって、スレッド関連だとスケジューラをいじることになる。
(゜Д゜)ハア?な人は必要ないということだから、この点について考える必要がない。
>>30が言っているように、判断は総合的にすればいい。
いずれにせよ、>>10,11にはSolaris, source code付きを勧めるよ。
http://www.sun.com/smcc/solaris-migration/docs/courses/threadsHTML/contents.html
http://www.sun.com/software/white-papers/wp-realtime/
このくらいは読んだ方がいいよ。> thread語りたい人
004211
NGNG>いずれにせよ、>>10,11にはSolaris, source code付きを勧めるよ。
どーもーです。
たった今からダウンロード開始します。
バイナリの方はインテル版だけですが・・・
ところでこれってFreeSolarisをダウンロードすれば
カーネルのビルドができるんですよね?
http://www.amazon.co.jp/exec/obidos/ASIN/0130224960/ref=pd_sim_fb_dp_1_1/249-1864945-9054761
ついでにこれも注文しました。
0043デフォルトの名無しさん
NGNGpthreadでは穏やかになってるけど、いちいちcancellableかどうか調べるのか?
http://www.sun.com/smcc/solaris-migration/docs/courses/threadsHTML/cancel.html
Javaでもsuspend/cancelを導入した前科があるね。
http://java.sun.com/j2se/1.3/docs/api/java/lang/Thread.html
0044デフォルトの名無しさん
NGNG俺、頭悪いから良く分からないんだけど、どうなの?
0045デフォルトの名無しさん
NGNGとりあえず入手が楽なlinuexthreadsかpmpthread(*BSD)のsourceでも眺めてみたら?
linuxthreadsにはsemaphore.cってのがあるよ。
0046デフォルトの名無しさん
NGNGJavaのthread仕様は、pthread規格策定時の研究が反映されてなかったね。
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNGhttp://www.cs.buffalo.edu/~crahen/projects/zthread/
0049デフォルトの名無しさん
NGNGブルドックが出てくるよ
0050デフォルトの名無しさん
01/08/29 23:03ID:ufAQmXP2マルチスレッドで行いたいのですが、うまくいきません。
スレッドではなくプロセスが補足してしまうからなのですが
これをスレッド毎に行う良い方法は無いでしょうか?
できれば参考となるソースが読みたいのですが
なかなかありません。
0051デフォルトの名無しさん
01/08/30 00:01ID:C3TsWUikOSは?thread libraryは何か分かる?
0052デフォルトの名無しさん
01/08/30 00:11ID:MsTaBnpAhttp://www.cs.wustl.edu/~schmidt/ACE.html
005350
01/08/30 08:25ID:ZcipkBQkOSはLinuxで、thread libraryは、POSIX.1c
です。
0054デフォルトの名無しさん
01/08/30 14:00ID:C3TsWUik> OSはLinuxで、thread libraryは、POSIX.1cです。
linuxthreadsなのかな?
linuxthreadsは、規約にあってないところがあって、それが>>50とも関連していると思います。
詳しくはREADMEをの最後の辺りを読んでください。>>26も。
それから、この制限はlinuxthreads自体に由来するのではなく、
clone(2)自体に由来しますから、他のthread libraryを使っても駄目です。
close(2)を使わないuser level threadであるpmpthreadsも芳しくありません。
0055IDEなんてクソ
01/08/30 22:01ID:ZAelFQ6sついでに言うと、pthreadでシグナルは極力使わない方がいい。
どうしても使いたいときはシグナル受信スレッドをpthredのシグナル関数群を
使って実装して、他のスレッドはシグナルを受信しないようにマスクする。
このあたりはアスキーから出ている実戦マルチスレッドプログラミングを
熟読するとわかると思うよ。
0056デフォルトの名無しさん
01/08/31 01:50ID:JrJLvbeM> ついでに言うと、pthreadでシグナルは極力使わない方がいい。
つーか、かなり注意して使わないと、ってことじゃないかな。
同期し協調して動くthread群に、非同期で割り込んでくるわけだからね。
「どうしても」以下に書いてあるような工夫を応用毎に考えないと。
ダグ何とかさんのJavaのthreadの本もいいよね。高いレベルの設計話としては。
005750
01/08/31 20:34ID:rIUxoozo>>54
>>55
>>56
返事遅くなりました。
情報どうもです。なるほど〜、やっぱりマルチスレッドでの
シグナルは難しいしバグの温床にもなりやすいので
やらんほうがいいわけですね。私もあの後いろいろ
本を調べてみたのですが、シグナルハンドラ用のスレッド
を別途設けて他スレッドからのシグナルを全てその専用
スレッドで取り扱うようにするのが一般的みたいですね。
この場合不思議なのは、どのスレッドから発せられた
シグナルかを区別しないといけない場合どうやって区別
するのかということです。
0058
01/08/31 23:34ID:K2I6K2jMいつのまにか、プロセス間の通信に使われるようになって
おかしなことになってる。
0059デフォルトの名無しさん
01/08/31 23:34ID:JrJLvbeM> この場合不思議なのは、どのスレッドから発せられた
> シグナルかを区別しないといけない場合どうやって区別
> するのかということです。
signalはそういう機能(発信元告知)を提供してくれない。
けど、process内部のthreadからのsignalならば、
process内の事は自分で管理できるよね?
いずれにせよ、本当にsignal、つまり非同期的である必要があるのか?
必要があるとすれば、受け手側が割り込まれていいのはいつか?
signalは同時多発的に起きるかどうか?
なんて事を考えないといけないわけだけど、
よくよく考えると最後の部分は「割り込み」でやるんじゃなくて、
同期的にやった方が簡単だよね? (もちろんそれでいい場合は)
lockを保持したまま割り込まれちゃう事なんかを考えると。
pthread_cancelについて調べると、この辺の設計の指針が得られると思うけど。
> 本を調べてみたのですが、シグナルハンドラ用のスレッド
> を別途設けて他スレッドからのシグナルを全てその専用
> スレッドで取り扱うようにするのが一般的みたいですね。
となる理由も良く分かるだろうし。
0060これ定説?
01/09/01 00:05ID:8UdnvL3A006157
01/09/01 00:47ID:YEBV7iy6>process内の事は自分で管理できるよね?
ふむ、何となくわかった気もする。
>pthread_cancelについて調べると
これ調べてみますです〜。
0062IDEなんてクソ
01/09/01 01:11ID:N2P03Y3gマルチスレッドを使う場合は、極力シグナルを
使わない。素直にmutexを使った方がいいと思う。
プロセス間で通信する場合は、共有メモリでやれば、
シグナルより柔軟にできる。
それが難しいなら、マルチスレッドではなく古典的な
マルチプロセスでやったほうがいいよ。
0063デフォルトの名無しさん
01/09/01 01:40ID:/npc6JZk> Javaスレッドはクソ
メモリ管理しないでいいところとか、
VMに囲われていてOSのnative API使えないところとか、
thread programmingのいやらしいところに首突っ込まないですむから楽。
もちょっと過去の研究の成果を踏まえて欲しかった部分もあるけど。
0064デフォルトの名無しさん
01/09/05 22:39ID:6B5pO.k2定説。synchronizeキーワードが特に酷い。
いわゆる普通のthreadでなので、その点においては、
プログラミングの上で特に楽になるということはない。
むしろ中途半端な仕様のせいで混乱する可能性が高い(yieldのタイミング等)。
初心者には勧められない。
利用者に徹するなら問題ないと思うけど、それは他の言語(系)でも同じ。
提供者になるなら、標準パッケージのソースは一度見ておくこと。
嫌になるよ。
0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNG0067デフォルトの名無しさん
NGNG>標準パッケージのソース
っていうのは、java.lang.Thread.javaのことではない?
見てみたら、nativeばっかりで、実体はわからなかった。
>synchronizeキーワードが特に酷い
というあたり、少し具体的に教えてもらえませんか。
0068デフォルトの名無しさん
NGNG>っていうのは、java.lang.Thread.javaのことではない?
たとえば、PipedInput/OutputStreamとか。
synchronizedについては...
1: protectedなメソッドが継承クラスでsynchronizedになっちゃった。
という状況で何が起こるか考えてみよう。
2: synchronizedで待ってるスレッドを中断させることができるか
できないか、について考えてみよう。
0069デフォルトの名無しさん
NGNG0070デフォルトの名無しさん
NGNG>という状況で何が起こるか考えてみよう。
クラスを使うがわの認識不足でバグがでる可能性がある
>2: synchronizedで待ってるスレッドを中断させることができるか
>できないか、について考えてみよう。
プログラミングテクニックが必要だけど、できる
0071デフォルトの名無しさん
NGNGださすぎ。
0072デフォルトの名無しさん
NGNGsynchronizedでlockを得られないで待っているスレッドを中断させる
のは一般には、できないことになってるけど、どうやるの?
0073デフォルトの名無しさん
NGNG0074デフォルトの名無しさん
NGNGっていみじゃないかな。
0075デフォルトの名無しさん
NGNGとりあえず、sage
0076デフォルトの名無しさん
NGNGwait/notifyは、そのオブジェクトのロックを持っているスレッドから
しか呼び出せない。つまり、synchronizedメソッド(ブロック)の中で
呼び出す必要がある。
0077デフォルトの名無しさん
NGNG茶々気味だが...
0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNG> wait/notifyを使ってsynchronizedと同等の動作を作り込んでやれば、待っているThreadの中断も可能。
> っていみじゃないかな。
synchronizeキーワードは使うなって結論?
0080デフォルトの名無しさん
NGNG>2: synchronizedで待ってるスレッドを中断させることができるか
だろ。
この意味は、synchronizedメソッドまたはブロックに入るために、
ロックの獲得を試みて、得られなく(他のスレッドが持っている)、
待っている、ということだよね。
こんな状況で、どうやってwait/notifyとかできるのよ。
0081デフォルトの名無しさん
NGNGスレッドが synchronized ブロックに入るじゃん。
0082デフォルトの名無しさん
NGNGここの人達がどれだけマルスレッド使いこなしてるのか疑問。
ていうか難しいと思ってるのは漏れだけかな(自爆
0083デフォルトの名無しさん
NGNG・変数を保護しないと、途中で値が(他のスレッドにより)変更される事がある。
っていうのは分かるんだけど、
・リエントランスを防がなくてはいけない。
ってどういうことなの?
0084デフォルトの名無しさん
NGNG状況をもっと書いてもらった方がいいと思うけど?
リエントラントを許してもマルチスレッドにする方法はあるけど?
0085デフォルトの名無しさん
NGNGマルチスレッド自身は別に難しくもなんともないよ。
javaの実装がヘタレなだけ。
0086デフォルトの名無しさん
NGNGそもそも設計ミスを言語仕様のせいにしてるところが問題なのでは?
>2: synchronizedで待ってるスレッドを中断させることができるか
できないけど
なんの問題もない
これが問題だと思ってるなら、才能が無いと思って
プログラマーやめた方がいいと思うよ
0087デフォルトの名無しさん
NGNG締め切り間近の追いつめられたプログラマもいたりして
0088デフォルトの名無しさん
NGNG>プログラマーやめた方がいいと思うよ
こんなことをいうのは802だけだから気にしなくていいよ
0089デフォルトの名無しさん
NGNGなんか昔の職人さんみたいw
0090デフォルトの名無しさん
NGNGそれとも、プログラミングが一番得意だったりして(笑)
0091デフォルトの名無しさん
NGNGそれともオナニーが一番得意だったりして(藁)
0092デフォルトの名無しさん
NGNGクロスポストですみません。
今、801板で2ちゃんねるの有志が集まった同人ゲームの
開発が進んでいます。
801板住民で本気でボブゲを作るスレッド2
http://www2.bbspink.com/test/read.cgi?bbs=801&key=1001692226
主人公「ひろゆき」(名前変更可能) が周囲の少年・青年を
調教していく801Hゲームです。
現在、プログラムの方も募集中ですのでもし興味をもたれたら
のぞいてみてください。
0093デフォルトの名無しさん
NGNG0094デフォルトの名無しさん
NGNG2についてはsynchronizedで待っているスレッドは原則として中断できない。
(Thread#stopで停止はできるが、これは危険!)
ただし、synchronizedとwait,notifyを使って中断可能な
mutexやセマフォを作ることは可能。
(当然synchronizedを使うが、どのような状況でもsynchronizedで長期間ブロックしないように実装すればよい)
...というのが正解。
1についてはsynchronizedメソッドをfinal指定するか、
もともとsynchronizedしなくてもいいように読み出し専用
オブジェクトにしてしまうというのも手だな。
java.util.Collectionsなんかがやってることも参考になるので見てみれ。
Javaスレッドの正しい使い方、問題点は以下のリンクを参照。
外人の言う事はためになるので読め。
http://www-6.ibm.com/jp/developerworks/java/010427/j_j-thread.html
http://www-6.ibm.com/jp/developerworks/java/010302/j_j-king.html
64はパッケージのソース見れって言うけど、
移植性の高いプログラム書こうという人は
そんなことしちゃいけないんだぞー
0095横槍君
NGNGにしているってことは
その処理をしている間は他から一切いじられては困るはず
stopで強制終了させてしまうと触られてはまずい状態のまま
同期は解除されてしまう
とゆう単純なはなしですよね。
分かっててやるぶんには問題ないのだろうけど
ほとんどアプリの強制終了くらいにしか
おいらはうまい用途が思い付かない。
そんならexit()でいいじゃんってことに、、、
ところで自分はJavaのスレッドくらいしか知らないんだけど
世の中にはもっとスゴイ便利なしくみやライブラリが
ありそうなきがするです。
※のスレッドはほにゃららで凄いんだぜ
とかほげほげで便利だぜ
とかいうのを識者にぜひ自慢していただきたい所存
0096デフォルトの名無しさん
NGNGスゴイ便利な仕組みと言えば「セマフォ」
大昔からある同期機構なのに、これさえあれば
Javaのwait/notifyのようなことはもちろん、
mutexもリードライトロックも作れる。
できないのは、タイマーや、Javaで言うyieldみたいな
スレッドのスケジューリングに係わることかな。
それ以上のレベルのことをスレッドライブラリ自体に求める
必要は必ずしもないと思うが。
こういうことは、もっと上位のライブラリか
アプリケーションで実装すればいい。
足りないのは便利なライブラリではなくて、
並行プログラミングをちゃんと理解している人間の方。
余談だけどDBのトランザクションが一番身近で
スゴイ同期機構だと思うぞ。
厨房でも理解できるし。
0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNG>2についてはsynchronizedで待っているスレッドは原則として中断できない。
>(Thread#stopで停止はできるが、これは危険!)
Thread#stopで、lockの獲得を待っているスレッドを停止できる、とは言えないのでは?
例えば、スレッド1がロック1を持ち、スレッド2がロック2を持っていて、
スレッド1がロック2を獲得しようとして、同時にスレッド2がロック1を獲得しようと
する、いわゆるデッドロックの状態で、別のスレッドからスレッド1のstopを呼んでも、
スレッド1は停止(中断)しない。結局、デッドロックは解消しない。
元の問いが、synchronizedで待っているスレッドを中断する、ということだから、これは
stopでもできないというのが正解では?
mutexなどの利用については、その通りだと思うけど。
0099デフォルトの名無しさん
NGNG(Javaに限らず、パターンか何かでありませんでしたっけ?)
0101デフォルトの名無しさん
NGNGもしかして、デッドロックが起こるような状況でしか
synchronizedで待つことはないと思ってる?
010298
NGNG何かお互いに誤解があるようだね。
漏れは、「synchronizedで待つ」、の意味を、例えば、
synchronized void doSomething(){}
というメソッドをあるスレッドが実行しようとして、thisのロックを他の
スレッドが持っているために、待たされている状況を想定している。
もちろん、ロックを持っているスレッドが、そのロックを手放せば、問題ないけど
そうでない場合に、どうか、ということ。
それ以外に、synchronizedで待つことを、問題にする理由がわからない。
synchronizedがロックの獲得を待つのは、問題、ではなく仕様。ただし、
タイムアウトの手段はない。例え推奨されないstopメソッドでもね。
デッドロックの例をあげたのは、この点を理解しやすいと思ったからだよ。
それを問題として捉えるかどうかだけど、タイムアウトが必要な場合は、
mutexとかで対応すればいい。
逆に、synchronizedの手軽さは、javaのメリット、というのが漏れの判断。
0103デフォルトの名無しさん
NGNGそれはもしかして、
「UIスレッドは出来る限りロックしてはならない」
という類のこと?
0104_
NGNGMFC並みのC++用マルチスレッドライブラリって何かありませんか?
0105デフォルトの名無しさん
NGNG素直にWin32 APIかpthreadつかえ。
0106デフォルトの名無しさん
NGNG記憶があり。ヘタレにはちとつらいな。
0107デフォルトの名無しさん
NGNG0108デフォルトの名無しさん
NGNG何を指して継承といってる?
0109デフォルトの名無しさん
NGNG0110デフォルトの名無しさん
NGNG0111デフォルトの名無しさん
NGNG0112白痴
NGNG0113デフォルトの名無しさん
NGNGC runtimeは一切使わないってことか・・・大変そう
0114デフォルトの名無しさん
NGNG0115デフォルトの名無しさん
NGNG0116デフォルトの名無しさん
NGNGあったとしてもprintfの%出力ぐらいか。
0117デフォルトの名無しさん
NGNG0118名無しさん@Emacs
NGNG他のスレッドに割り込んでreadをやめさせたいときは、普通どうするの?
0119デフォルトの名無しさん
NGNGなんでread止めさせたいのか判らないです。
readして物理的な待ちに入ったら内部でスレッド切り替えてるけど??
0120名無しさん@Emacs
NGNGpipe/select使えばいいのかな?
ちと面倒だけど。
0121デフォルトの名無しさん
NGNGじゃなくて?
0122デフォルトの名無しさん
NGNGshutdown()しちゃえばいいじゃん
0123名無しさん@Emacs
NGNG次に移らせたいのです。
pipe/selectでできましたよ。
これでいいのかな?
0124名無しさん@Emacs
NGNGどうやればできるんだろう。わからなくて泣きそう
0125デフォルトの名無しさん
NGNG無理。だからバカみたいにスレッドを増やすしかなかったりする。
0126デフォルトの名無しさん
NGNGpthreadってたいしたこと無いんだね。
俺が作ったマルチスレッドのアプリで
WaitForMultipleObjects使ってないものはない
0127名無しさん@Emacs
NGNG0128名無しさん@Emacs
NGNGhttp://cocoa.2ch.net/unix/kako/975/975847617.html
0129デフォルトの名無しさん
NGNG必要なんですか?
0130名無しさん@Emacs
NGNGどこかにデータが入ってきたら動作を開始するとか。
Win32のsignalオブジェクトに相当するものは
条件変数を使って簡単に作れたから、
WaitForMultipleObjectsに相当するものを汎用的に作るには、
そのsignalオブジェクトを使って
スレッド一つにつき一つずつただjoinするだけのスレッドを作って、
joinがすんだらシグナルを立てるようにすればいいのかな。
効率わる〜
もっといい手はないのだろうか。
0131デフォルトの名無しさん
NGNGだめなんか?
0132デフォルトの名無しさん
NGNGこれってPthreadと似たようなものなんでしょ?
C++で書く事も前提になってるみたいなんだけど・・・
0133デフォルトの名無しさん
NGNG>>131 が正しい。スレッドが個々に Signal オブジェクトを
持つのではなく、単一の Signal オブジェクトに複数のスレッド
から notify を行うようにデザインする。
0134デフォルトの名無しさん
NGNGそれだとスレッドがシグナルオブジェクトを知らなければならない。
もっとシンプルに〜
0135デフォルトの名無しさん
NGNGThread t = new AbcThread(signal);
synchronized(signal){
t.start();
signal.wait();
}
てか、どこをどうシンプルにしたいの?
引数渡しすらやりたくないの???
0136デフォルトの名無しさん
NGNG0137135
NGNGObject signal = new Object();
Thread[] t = new Thread[10];
synchronized(signal){
for(int i=i; i<t.length; i++){
t[i] = new AbcThread(signal);
t[i].start();
}
signal.wait();
}
public class AbcThread extends Thread{
private Object signal = null;
public AbcThread(Object signal){
this.signal = signal;
return;
}
public void run(){
...
synchronized(signal){
signal.notifyAll();
}
return;
}
}
0138デフォルトの名無しさん
NGNG言いたいことは分かったが、
WaitForMultipleObjects(OR)みたいな美しさがなくていいなら、
pthread_cond_waitで十分できるので。
0139135
NGNGまずそこら辺の美的感覚が違うな...。まぁ趣味的な
相違を深く突っ込む気もないので好きにしてくれ。
0140名無しさん@Emacs
NGNG美しいと思ったが、何か偏見があるのじゃないか。
0141デフォルトの名無しさん
NGNGあるマシンではsleep(2)とかが正常に動作している
(PIOボードに出力させてそれをオシロで見た結果)
のに、別のマシンでは、小さな値を渡しても10msec以下になりません。
対処法ありますか?
0142デフォルトの名無しさん
NGNG0143デフォルトの名無しさん
NGNGこれに相当するもののない環境って意外に多い。というかwin32だけ?
0144デフォルトの名無しさん
NGNGそもそも、マルチスレッドがデフォルトっていう概念は、
winが最初じゃない?
0145デフォルトの名無しさん
NGNGsleep()でmsecオーダーの動作を期待することがイタい。
0146デフォルトの名無しさん
NGNGできるのでしょうか?
WinNT+VC++で
0147デフォルトの名無しさん
NGNG割り込みをマスクしてタイマーを監視してればいいだろうが、
システム全体がパフォーマンスダウンして不安定になるだろう。
0148デフォルトの名無しさん
NGNG何をやりたいのか書けば?>>146
0149デフォルトの名無しさん
NGNGmachが研究的にあれこれやってたみたいだけど、
実用OS上でインプリし、かつ実用しているのはwin32が最初かも。
0150デフォルトの名無しさん
NGNG複数のデバイスで発生したときに、アプリが
割り込ませてくれなければ、ちゃんとシステムは動かない。
どうしてもやりたきゃネットワークもハードディスクも
ないワンボードマイコンでやるしかないだろうと思われ。
0151デフォルトの名無しさん
NGNG"123456789"のcharデータを送信するプログラムと
それをスレッドで受信するプログラムを使い、テストしました
結果は
123456789
12543789 123456
などスペースが勝手に入ったり、改行したりしなかったり
順番が入れ替わったりしました
正確な受信をすることはできるのでしょうか?
お願いします
0152146
NGNG【目的】
あるスレッドでパルスモータをPIOボードを通じて回したい。
【課題】
PIOボードへの出力後、スリープさせたいが、
1msec単位でしかスリープできないと、回転速度をきめ細かく設定できない。
0153デフォルトの名無しさん
NGNGforkはもういらないって事?
0154デフォルトの名無しさん
NGNGんなこたぁない
forkの方が便利な場合も依然としてある
0155デフォルトの名無しさん
NGNGまずはスレッドを使わないでちゃんと受信ができているかテスト。
0156デフォルトの名無しさん
NGNGどう考えてもマルチスレッドの質問じゃないと思われ。
0157デフォルトの名無しさん
NGNGモジュール間の結合度が低くてデータのやりとりがIPCで十分な場合、
forkを使う方がいいと思ってる。
0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNG分かってないなあ。
正確さをあきらめるならタイトループを
ベンチマーク的に測定してテキトーに。
たぶんきれいな方形波でなく、
不揃いのパルスになる。
正しくパルスを送るんなら、そのデジタルI/Oボードに
そのパルスを発生させるICを何とかして繋ぐのが正攻法。
H8なんかはPWMとRS232を内蔵していて便利。
0160名無しさん@お腹いっぱい。
NGNG>InterlockedIncrement()はなんでガードしないと行けないんですか?
マルチプロセッサ環境で問題が出ます。
inc命令といってもリード/ライトサイクルがあり、その間に他のCPUが処
理する可能性があります。実際、マルチプロセッサマシンでそんな不具合
が起きそうなプログラムを書いて試してみてください。
非x86のときは、x86の命令に対応するものに展開される保障はありません
(>20も少し触れている)。
0161デフォルトの名無しさん
NGNGやっぱマルチプロセスもいいよね。プロセスの死亡は痛くないけどスレッドの死は
痛い。あと信頼度の低いものをまとめあげるときには、疎な結合のほうが
いいから、プロセスを防波堤として使うのも好き。
にしてもマルチプロセスのときのプロセス間の連絡って皆どうしてんの?
POSIX IPC? System V IPC? pipe? socket?
それともRPC? またはCORBAとか分散オブジェクト使うの?
0162デフォルトの名無しさん
NGNGとりあえずsocket。
0163152
NGNG言葉足らずでしたか。スマソ
ステッピングモータを回すスレッド以外に、通信や表示のスレッドがあって、
モータを回す際にスリープを正確にさせたい。
0164デフォルトの名無しさん
NGNG159みれ >>159
0165152
NGNGみたけどー。
要はmsec未満のスリープはできないのね。
0166デフォルトの名無しさん
NGNGそこまでの解像度を持つタイマが必要なら
もはやNTの出る幕ではないのでは…?
リアルタイムOSとか必要なんでは? よく知らんけど。
0167デフォルトの名無しさん
NGNG以前NT用のセントロボードの読み出しドライバーで、
割り込みの奴とストローブをCPUで監視する奴の2種類
付属している奴があった。
その注意書きに、割り込みなしの奴は取りこぼしあり
とあり、保証なしだが、全く使えないわけではなく、
テキトーもありなんだとちょっと感心した。
0168デフォルトの名無しさん
NGNGマイクロ秒単位でタイマーの監視は出来そう
でも、それをやるとCPUがそれにかかりきりで、
ほかのスレッドを動かせなかったりするんでは。
0169デフォルトの名無しさん
NGNGだから>>159見ろと何度も言われてるのに取り合わない馬鹿は
ほっといて勝手に困らせとけ。
0170デフォルトの名無しさん
NGNG165に見たと書いてるけど。。
0171デフォルトの名無しさん
NGNGただのヴァカ
0172デフォルトの名無しさん
NGNG0173かなみ
NGNG関数内ではstaticな変数は使っていないんですが、、、
0174デフォルトの名無しさん
NGNGコードに対して起きるものではないから。
実は同じオブジェクトを引数に渡してて、そいつが競合してるとか?
0175かなみ
NGNG大丈夫なんですね。
0176名無しさん@XEmacs
NGNG> 関数内ではstaticな変数は使っていないんですが、、、
MT(multi-thread) safeな関数しか呼び出しちゃ駄目よーん。
例えば、UNIXだとgethostbynameはMT-safeじゃない。
gethostbyname_rがMT-safe版。
0177デフォルトの名無しさん
NGNG呼び出す周囲をMutexでくるむという手もある
すべての箇所で出来るという保証があればの話だが
0178デフォルトの名無しさん
NGNG別にマズくないです。
同じメモリ領域に、複数のスレッドで同時に書き込んだり、
あるスレッドから書き込むと同時に別スレッドで読み込んだり、
しない限り全然大丈夫です。
0179かなみ
NGNGと理解しましたが、それでOKですか?
0180デフォルトの名無しさん
NGNGたまに表示が化けたり原因不明のエラーを出すの得意だろ
0181デフォルトの名無しさん
NGNG同時に読み出しだけならOKです。
書き込みが混じるときは気を付けましょう。
0182デフォルトの名無しさん
NGNGラッパー関数かけ。
0183デフォルトの名無しさん
NGNG時刻の取得⇒文字列として表示、にlocaltime, ctimeを使おうと思ったのですが
スレッド安全ではないために、localtime_r, ctime_rで記述しました。
ところがコンパイルは通るものの、実行すると上記箇所にて
coreを吐いて死んでしまいます。
(localtime, ctimeで記述時の動作は、期待通りです)
Solaris8, gcc295を使用しているのですが、
"*_r"関数には、何かしらの制限等があるのでしょうか?
0184デフォルトの名無しさん
NGNGmutexでもいいぞ。
0185デフォルトの名無しさん
NGNG0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNGとりあえず「スレッドセーフ」って読んだほうが良いかと...。
>>179
どういう構造でmulti-threadが実装されているのか理解するまでは
愚直に危うそうな資源を排他するのをおすすめします。
「同時に同じ領域へアクセスしなければ特に排他処理をしなくても問題ない」
という表現に危うさを感じます。
たとえば、排他をしないでどうやって同時でないことを保証しましょう?
0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNGフツーのlocaltimeとかctimeとかは、ライブラリ内部の?共通バッファに
結果を展開するので、別のスレで使われると、書き換えられる可能性がある。
ということじゃなかったかな?
まあ、あんまりセーフかどうかを気にしなくてもいいのかもしれんが、建前上はスレセーフではない。
0191_
NGNG保障されるのかな
0192183
NGNG起きた現象でした。
メモリ確保をすることによって無事解決をしました。
ありがとうございます。
メモリを確保する必要があるのですね、知りませんでした。
その必要性は、以下のような解釈でよろしいですよね。。。
localtimeは、関数内static領域を保持することを前提に設計された関数であり
localtime_rは代替関数である。この関数はライブラリ内部の共通バッファを
使用しないことによってスレッドセーフを実現しているため、当然
自前でメモリを確保する必要性がある。
0193デフォルトの名無しさん
NGNGVC++の場合、マルチスレッド用のランタイムは内部で
動的なバッファを確保してる。
0194デフォルトの名無しさん
NGNGなので、大丈夫だよ。>>191
0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNGま、「全部」ではないと思うが
0197デフォルトの名無しさん
NGNG常駐処理をスレッドで作成しています。
スレッドが終わった場合に、もう一度起動するように
しようとしているのですが、
終わった筈のスレッドなのにGetExitCodeThreadでのコードが
STILL_ACTIVEになってしまいます。
何かおかしいでしょうか?コードは次のようなものです。
よろしくお願いします。
void main()
{
〜略〜
while(1)
GetExitCodeThread( (HANDLE)hThread, &ExitCode );
if( ExitCode != STILL_ACTIVE ){
hThread=_beginthread( ThreadProc, 0, (VOID *)NULL);
}
}
}
void ThreadProc( void *p )
{
/*処理*/
return;
}
0198デフォルトの名無しさん
NGNG0199194
NGNG0200デフォルトの名無しさん
NGNGcdeclとstdcallとではスタックの解放の仕方が違うんだよ。
大方、リターン直後でスタック破壊を起こしていると思われ。
0201デフォルトの名無しさん
NGNGちょっと話題がずれるけど、ポインターをやりとりする時に
実態の領域を誰が用意するかはドキュメントを読まないと
判らないのはC言語の限界ですよね。。。
用意するにしても、領域の大きさも表現できないし。
>localtime_rは代替関数である。
代替かなぁ?
localtimeの仕様が気に入らない人が多くって、
thread-safeにするついでに関数の定義を直しちゃったとか?
0202デフォルトの名無しさん
NGNGsprintf→snprintfという変化もあるよ
thread-safeとはまた別に。
0203名無しさん@XEmacs
NGNG> thread-safeにするついでに関数の定義を直しちゃったとか?
1. 仕様を変えないとMT-safeにならない。
2. 勝手にmallocするようにしないとMT-safeにならない。
という究極の選択で、1を選んだという事。
Lisp, Java, C#が2を選んで、
> 実態の領域を誰が用意するかはドキュメントを読まないと
> 判らないのはC言語の限界ですよね。。。
を克服するためにGCを採用した(知る必要なし)のはご存知の通り。
0204デフォルトの名無しさん
NGNGthread safeじゃない物はstruct _tiddataでまとめてTLS管理してる
ようだが。crt/src/mtdll.h辺り参照。
0205デフォルトの名無しさん
NGNGどうしたらいいので良いでしょうか?
自分で調べた中では、自分自身(呼び出し元)を終了させる方法しか
見つかりませんでした。
0206デフォルトの名無しさん
NGNG↓
仕事しながらたまに社内掲示板を待ち時間ゼロとかで調べる
↓
終了通知が来てたら、仕事を辞めて首をつる
↓
スレッドハンドルとかを待機して解雇を確認する
スレッドハンドルで解雇の確認ができないときは、死に際に
遺書(同期オブジェクト)を残す
↓
解雇完了
0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNGどうもです。
TerminateThreadについては、参考書に例として載っていましたが、
リスキーなので使わない方が良いと書かれていました。
他に安全な方法は無いでしょうか?
0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG206の解説:子供スレッドはある変数を監視し、それがある値に
なったら終了するようにしておく。親スレッドは、終了させたく
なったら、その変数をセットする。
当然だけど、子供スレッドは定期的にその変数を監視しないといけない。
かなり面倒。通信量が少ないなら別プロセスのほうが楽かもね。
任意のタイミングで無理矢理殺せるスレッドライブラリは少数派。
つかSolaris以外に知らない。
0212デフォルトの名無しさん
NGNG>任意のタイミングで無理矢理殺せるスレッドライブラリは少数派。
ただのpthreadでは...。(普通のUNIXで採用しているthreadね(かなり略))
0213デフォルトの名無しさん
NGNGメッセージループと同様の作りでもいい、こっちの方がメッセージ
遅れるので融通利く
0214デフォルトの名無しさん
NGNG私は代替にスレッドセーフなやつを適当に
自作してつかっちゃってるんだけど・・
0216デフォルトの名無しさん
NGNGエラーが返ってくるんですが、これってどんなことが起こってて、どう解決していけば
いいのでしょうか?
VC++なんか初めてなのにマルチスレッドのプログラムのデバッグやらなきゃ
いけなくてヘルプ見てももうさっぱりです。
他のスレッドが使っているのだろうか?などとも考えたのですがそれをどうやって
調べればいいのかもわからないです・・・
ホントどうしようもなくシロートで申し訳ないんですが、よろしくお願いします。
0217デフォルトの名無しさん
NGNGWindowsNT以降ではinet_ntoaはスレッドセーフ(同じスレッドで再度Winsock関数が呼び出されるまで返された文字列は有効)だ。strtokも同様。
0218デフォルトの名無しさん
NGNGそのpthreadはニセモノだね。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG解説どうもです。
>>213
やっぱり、皆さんの提案されるような小技をつかわないと実現できない
のでしょうか?
シンプルに命令一つで実現できないものかと調べています。
あっても良さそうな命令なんですが、やっぱ別スレッドを終了させると
言う事はあまり良くない事(いろいろと問題がある)なのでしょうか?
仕様上、今の所は別プロセスを作る事は考えていません。
0221名無しさん@XEmacs
NGNG> シンプルに命令一つで実現できないものかと調べています。
何作ってるか書かないと、
そのthreadが取得しているlockはどうするんだ?
とかいうアドバイスをしにくいぞ。
0222デフォルトの名無しさん
NGNGそのスレッド内で使用するあらゆるリソースのためのマネージャを、メインスレッドが管理すればいい。
ただし、トランザクション中だけ、メインスレッドが待機する仕組みを必要とする。
で、そういうプログラムを以前1回仕事で作ってみたけど、問題なく動いてはいるね。
(子スレッドが使用するリソースがある程度限定できたからだけど。)
0223デフォルトの名無しさん
NGNG理解しやすいように具体例を挙げると、こういうことです。
次のようなスレッドがあるとします。
void thread()
{
FILE* fp = fopen("a.txt", "r");
/*ここで色々な処理をする*/
fclose(fp);
}
メインスレッドからこのスレッドを終了させようとする場合、
このスレッドは、まだ処理実行の途中ですよね?
スレッドを途中で終了させたら、fclose は実行されないですよね?
困りませんか?
ここでfcloseが確実に実行されるためには、
(1) メインスレッドで fclose を実行する
(2) 子スレッドが自分で終了処理して fclose を実行する
のいずれかですが、FILE* fp がローカル変数だったら、
メインスレッドからファイルを閉じる方法は実行不可能です。
メインスレッドから子スレッド終了させると、
子スレッドは fclose を呼ぶヒマなく終了させられますからダメです。
そーすると、終了フラグを立てるなりして
子スレッドが自主的に終了するよう仕向けるしかないわけです。
おわかり?
0224デフォルトの名無しさん
NGNG但し書きのないいつ殺してもいいスレッドなんて
業務プログラムでは皆無だな(藁
ゲーム系ならあるのか?
0225デフォルトの名無しさん
NGNG残念ながら命令ひとつてポンってのはないよ。
スレッド管理をしてくれる魔法のつえなんてどこにもない。
ほとんどの場合同期処理が絡んでくるから、
設計は慎重に、コーディングは明快かつ丁寧にやるように。
0227デフォルトの名無しさん
NGNGsend a signal to a thread
SYNOPSIS
#include <pthread.h>
int pthread_kill(pthread_t thread, int sig);
DESCRIPTION
The pthread_kill() function is used to request that a signal be delivered to the specified thread. As with kill(), if sig is zero, error checking is performed but no signal is actually sent.
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGpthread_killを使えばシグナルを遅れるが、
受け取り側のスレッドが正しくシグナルを処理できないと、
後で悲惨な目に遭うよ。
0232デフォルトの名無しさん
NGNG0233212
NGNG言われていることの意味がわからんです。
そろそろ眠いけど、教えてほしいです。
0234デフォルトの名無しさん
NGNG0235デフォルトの名無しさん
NGNGどうもありがとうございます。
> 何作ってるか書かないと、そのthreadが取得しているlockはどうするんだ?
> とかいうアドバイスをしにくいぞ。
はい、其の通りですね。情報が少なくてすみませんでした。
1つのプロセスがあり、親スレッドと子スレッドが常駐しています。
子スレッドでは通信処理(無限ループ処理で、イベント待機していて
イベントが発生すれば通信を行う)を行っています。
今、考えている流れは、
1)メインプロセスから、このプロセスに終了の依頼(アプリ終了処理依頼)
↓
2)親スレッドが子スレッドに終了依頼をかける
↓
3)子スレッド内の処理で通信中であっても通信を強制的に終わらせて
子スレッドを正常に終了させる。(ローカル変数もろもろを全て開放)
※但し、通信中の内容については保証しなくても良い。
↓
4)親スレッドから子スレッドが正常に終了したのを確認した上で、親スレッドを終了。
要は、子スレッドにおいて通信処理を行っている最中に割り込みをかけて
子スレッドを終了したいと考えています。
<現在>
子スレッド(無限ループ)
・イベント待機
・・イベント発生⇒通信処理
<変更>
子スレッド(無限ループ)
・終了依頼チェック
・・終了依頼あり⇒子スレッド終了
・イベント待機
・・イベント発生⇒通信処理
上記のようにも考えてみたのですが、これだと終了依頼をかけても通信中の場合だと
通信が完了して、ループが先頭に戻ってくるまで終了できません。通信中であっても
すぐに子スレッドを終了させたいと考えています。(通信内容については保証しなくて
もいい)
以上、よろしくお願いします。
0236デフォルトの名無しさん
NGNG0237
NGNGスリープしておいた子スレッドを起こした方がよくない?
0238デフォルトの名無しさん
NGNGSIGALRMを送って、子スレッドの関数がEINTRで返ったのをみて
終了すればいいような…
0239デフォルトの名無しさん
NGNG窓だったら子スレッドをMsgWaitForMultipleObjects使わせて待機させ、
親スレッドは子スレッドにメッセージを投げることで終了依頼とする
通信を完全に非同期で行なえばメッセージを待つだけでも出来る
UNIXだったらパイプをポーリングすれば親の終了依頼とクライアントとの
通信を同時に待機できる
細かい使い方は自分で調べろ
0240デフォルトの名無しさん
NGNG>>235は強制的に終らせてなどと言ってるので通信は
ブロッキングでしたいのだと思われ。
0241デフォルトの名無しさん
NGNG0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNGスレッドを外から強制終了させよーとすると ThreadDeath 例外が走る。
0244デフォルトの名無しさん
NGNGWin32&C++で、あるスレッドから別のスレッドに例外出せたら、
ちょっと悦なんですが。
ざっと調べた範囲ではなさそうだったんだけど、
見落としてるかもしれんので。
なんか情報あったらください。
0245
NGNGDim i As Double
Dim iAnswer As Double
X = Worksheets(1).Cells(13, 2)
A = Worksheets(1).Cells(11, 7)
For i = X To A Step 0.0000001
iAnswer = i
Next
sAnswer = Str(iAnswer)
Worksheets(1).Cells(13, 8) = sAnswer
End Sub
-----------------------------------------
X=C10
A=IF(A13="",""ROUND(B13+E13+F13,6))
と、それぞれのセルには数式が入っています。
Aのセルは
sAnswerのセル(13, 8) に数値が入らないとAの答えが出ないから
「#DIV/0!」となってます
この状態で実行すると
For i = X To A Step 0.0000001
のとこで「型が一致しません」とエラーなります。
「#DIV/0!」だとダメなんでしょうか?
0246デフォルトの名無しさん
NGNGゼロクリアしてしまえば、そのスレッドがそのポインタをさわった瞬間に
Access Violation例外が発生するようにできますが。
やはりメッセージを受け取って、例外を送出するという方が無難でありましょうか。
0247デフォルトの名無しさん
NGNGイキナリThreadDeathのはなしより、普通は
「WAITスレッドにInterruptかけてInterruptedException」
のはなしが先でしょうに。
0248デフォルトの名無しさん
NGNG共有メモリのフラグを時々見に行って、フラグが
落ちていたら例外投げればいいじゃん。
0249名無しさん@XEmacs
NGNG> ざっと調べた範囲ではなさそうだったんだけど、
> 見落としてるかもしれんので。
「Win32 マルチスレッド プログラミング」J. Beveridge, R. Wienerでは、
第五章「スレッドを制御する」に「何時間にもわたる調査の結果、
私は確信を持ってWin32 APIは別のスレッドに対して例外を送出するための
標準的な手段はサポートされてないと断言する事が出来る」だってさ。
// ここで言う「非標準の」はdebug APIで>>246など。
Compilerはかなり大変だよ、非同期に例外送出されると。
どの命令間でも例外が発生すると思って"exception safe"を維持するなんてさ。
けど、欲しい機能だけどね。pthreadのcancel pointみたいに限定局面でいいから。
0250242=244
NGNG0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNGする。と思うけど。
0253デフォルトの名無しさん
NGNGスレッドが切り替わらないうちに、throw xxx;相当のコードに
書き換えてしまう、という手段がひょっとするとあるかもしれませんな。
まぁ、マルチプロセッサシステムでどうなるかは知りませんが。
0254デフォルトの名無しさん
NGNG銀行の預金の例、以外には無いのでしょうか?
0255デフォルトの名無しさん
NGNG0256デフォルトの名無しさん
NGNGQueueUserAPC使えば近いこと出来そうな気がする
あくまで気がする程度だけど……無理かな?
0257デフォルトの名無しさん
NGNG複数のスレッドから1つの変数、ファイル、その他の資源を
アトミックな1つの操作(≒間に割り込みが入らない機械語1命令など)
ではすまない書き込み、あるいは更新
を行う必要がある個所ではすべて必要です。
0258デフォルトの名無しさん
NGNG自販機のボタンを同時押しされたときに
押した分だけ缶コーヒーが出てくる仕組みにしたくないときに
排他制御しろ。
0259253
NGNGhttp://www.geocities.com/ghanyan/throw_thread.html
x86 & Win32限定で使い道は全くないけど、まぁ、作ってみまたり。
0260結樹
NGNG本がでます。ご期待ください。
買ってくださったら感謝します。
0261デフォルトの名無しさん
NGNGスゴイ設計だな
0262デフォルトの名無しさん
NGNGあほが作ったマルチスレッドのプログラムって怖いな(w
0263デフォルトの名無しさん
NGNGオブジェクト指向を始めて学んだときは
そういう設計をして楽しんだよ。
すぐに止めたけど
0264デフォルトの名無しさん
NGNGビデオ鑑賞専用の個室とか、
トイレとか、
なんでもいいぞ。
0265結樹
NGNGレス感謝します。
0266結樹
NGNGすみません。慌てて書き込みました。
たしかにあほが作ったマルチスレッドプログラムは怖いですね。
時間ができたら、あほのためのマルチスレッドプログラミングの
ためのパターンランゲージを書いてみたいと思います。
良いアイデアがでました。感謝します。
0267DPの名無し
NGNG本は買うと思うけど、あほが多数で実装しても困らない設計の進め方を
開発手法の観点から誰かと共著(don't treat)で、web公開してください。
(これぞ救済
あほじゃないやい。あほじゃないやい。DQNなんです。
0268デフォルトの名無しさん
NGNG0269デフォルトの名無しさん
NGNG別スレッドの話はともかく、VC だと /EHa で非同期例外処理モデルになるね。
0270デフォルトの名無しさん
NGNGちゃんと教育してほしい
0271デフォルトの名無しさん
NGNGなんだってそうだろ?
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNGここで言っても仕方ない。それは「アホ」なヤツの上司に言え。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNGクローズする必要は無いのでしょうか?
CloseHandle()で例外が出るのですが・・・
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNG例外が発生するのはおまえのプログラムが間違ってるからだ。
CloseHandleはしとけ。
TerminateThreadのヘルプはしっかり読んだか?
0278名無しさん@Emacs
NGNG0279270
NGNG0280デフォルトの名無しさん
NGNGご愁傷様です
でも板違いなので、プログラマー板に逝ってね。↓このあたりに、ソースコードを編集して
貼り付けると良いかと。
この会社辞めようと思ったソースコード#2
http://pc.2ch.net/test/read.cgi/prog/1001076034/
0281270
NGNGグチになってますので去りますすみませんsage
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNG実務ではwin32上でしかマルチスレッドアプリ作ったことない。
でも(゚д゚)ウマー
スレッドを作って、そのスレッドの中で、オブジェクトを作って
そのハンドルをグローバルにセットして、親からそのハンドルで
メソッドを呼び出す事ってできるんでしょうか。
0285デフォルトの名無しさん
NGNGメソッドって何なんだよ。
所有権の管理と同期はきちっとやれよ。
0286デフォルトの名無しさん
NGNGおそらく、GDCやなんやのグラフィックオブジェクト
ハンドルのことではないか?
依然意味不明だが。
0287デフォルトの名無しさん
NGNG返事遅くなりましたが、>236-240さん、ありがとうです。
まだ自分の中では解決案は出ていませんが、今までの情報を元に
がんばってみたいと思います。
0288真希
NGNG商品の買い替え時期(買った日からちょうど4年後)に、自動的に表示されるようなプログラム組むことって、できますか?
エクセルを少し習っただけの初心者なもので。。
0289デフォルトの名無しさん
NGNGそれはマルチスレッドと、どのような関係がありますか?
0290デフォルトの名無しさん
NGNG大袈裟なソフト作らなくても
時々4年前の日付で検索かければいいだけじゃないの?
でスタートアップにショートカット入れとけば?
0291デフォルトの名無しさん
NGNGなんかかわいい♥
サーバーを作ってるんですが、とりあえず以下の様な事
ができないかなと思ってます。
初心者なもので、ほんとに出来るのかどうか、かなり
不安な状態です。
1.サーバーとクライアントのクラスを作っておく。
2.親がサーバーのインスタンスを作り、accept処理するメンバ関数を
外部関数を通してスレッド呼び出しする。
3.クライアントからの要求があったら、accept処理するメンバ関数は
クライアントの処理をするスレッドを呼び出す。
その中でクライアントのインスタンスを作り(ハンドルをグローバル
にセット)、recv処理をするメンバ関数でWhileで回る。
4.sendする場合は、親がセットされたハンドルを通して、クライアント
のsend処理のメンバ関数を呼び出す。
親から、
0293あぁ
NGNG俺も今、チャットサーバ作ってるんで、知恵を出し合おう。
ていうかほぼ完成してるがね。
0294デフォルトの名無しさん
NGNG悪いことは言わない、スレッド使うのはやめたほうがいい。
0295293
NGNGま、それは目的によるわな。何百件のクライアントを処理しなけりゃ
ならんようなサーバーではスレッドはキツイが、内輪で使うような
せいぜいクライアント数人のチャットサーバならスレッドでOK。
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNGよければその理由を教えてください。
0298デフォルトの名無しさん
NGNG参考図書あるいは URL でおすすめがあったら教えてください。
英語のものでもかまいません。
0299shige
NGNG表紙がキライだが
0300デフォルトの名無しさん
NGNG??
0301デフォルトの名無しさん
NGNGこれなんかどうでしょう?
自分がこれから買うつもりなだけなんだけども(w
>POSIXスレッドプログラミング アスキーアジソンウェスレイシリーズ
>―Ascii Addison Wesley programming series
>David R.Butenhof (著), 油井 尊 (翻訳), 宗方 あゆむ (翻訳)
0302デフォルトの名無しさん
NGNG趣味なのか仕事なのかを教えてください
0303デフォルトの名無しさん
NGNG0304デフォルトの名無しさん
NGNGメンバ関数にしようとしてもスタティックじゃないと、
できない。しかし抜け道が。
0305デフォルトの名無しさん
NGNG0306デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNGThanks, こんど都内に行ったら大きな本屋に寄って見てみます
0309デフォルトの名無しさん
NGNG9xだと非常にやばい。
NTだとクリティカルなコードはみんなカーネルモードにあるので
おおむね問題ないけど。
0310デフォルトの名無しさん
NGNGメインスレッド+ワーカースレッド複数個のときに、
それぞれのワーカースレッドからメインスレッドへ
SendMessageして特定の処理をしたいのですが、
あるワーカースレッドのSendMessageによって
メインスレッドのコールバック関数内に入っている
ときに、別のワーカースレッドがSendMessageを
送ってきたとすると、コールバック関数内の
コードが並行して走ることになるのでしょうか。
つまり、SendMessageに応答するコールバック関数内の
コードで、グローバル変数などの排他制御が必要なのか
ということです。
0311デフォルトの名無しさん
NGNG自スレッドからのPostMessage同様、一旦メッセージキューに入る。
Advanced Windows読め。
http://www.ascii.co.jp/pb/msp/21292/21292.htm
0312デフォルトの名無しさん
NGNG0313U21
NGNGわたしはここで勉強しました。
http://www-6.ibm.com/jp/developerworks/linux/010119/j_l-posix3.html
3回物でこのページからたどって1回目からどうぞ。
わかりやすいと思います。
0314デフォルトの名無しさん
NGNGありがとまんこ
0315デフォルトの名無しさん
NGNGその共有バッファが見えているもう一つのスレッドに、Notification を送りたいのですが、
(その猛一つのスレッドはそのNotificationを受けるまで待っていて、受けたらそのデータ
を処理します。) 普通どう実装するものでしょうか? スマートな方法とかありますか?
0316デフォルトの名無しさん
NGNG処理系くらい書けば?
0317デフォルトの名無しさん
NGNGスレッド数が10ぐらいなら正常に終わるのですが、
スレッドを100とか1000にすると、なかなか終わりません。
原因は何でしょうか?
#define THREAD_MAX 10
volatile int stop[THREAD_MAX];
void thread_start(void *i) {
while(1) if ( stop[(int)i] == 1 ) break;
}
void test_thread(void)
{
int i;
for (i=0;i<THREAD_MAX;i++) {
_beginthread( thread_start, 0, (void *)i );
}
for (i=0;i<THREAD_MAX;i++) stop[i] = 1;
}
0318デフォルトの名無しさん
NGNGfor(...) stop[i]=1; の処理が回りにくいから。
ついでに 10 くらいだと thread_start が始まる前に
その stop フラグが立ってしまう可能性アリ。
#うそかもしれん。
0319デフォルトの名無しさん
NGNGありがとうございます。
100個の時は100分の1のタイミングで切り替わるのではなく
重たいループに優先的にCPUが使われてしまう、と考えていいのでしょうか?
0320デフォルトの名無しさん
NGNG終了しなくなりました。
マルチスレッドは難しい・・・。
for (i=0;i<THREAD_MAX;i++) {
Sleep(1000);
stop[i] = 1;
}
0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNGビジーループを使う理由は?
マルチスレッドの前にコンピュータの基礎を勉強してみれば?
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNGこれではずれだった日にはもう……
0326デフォルトの名無しさん
NGNG0327デフォルトの名無しさん
NGNGだけMUTEXでロックしたいのですが、その場合、pthread_mutex_t 変数を宣言する場所
は、例えば struct B の部分にのみロックをかけたい場合、以下のような風にすれば
よろしいのでしょうか?
struct A {
int a;
int b;
struct B bb:
} stA:
struct B {
pthread_mutex_t hoge:
int c;
int d;
} stB:
struct stA aa;
0328デフォルトの名無しさん
NGNG0329デフォルトの名無しさん
NGNGスマソ、宣言が何か変でした、もいっかい…
struct stB {
pthread_mutex_t mutex:
int c:
int d:
}
struct stA{
int a:
int b:
struct stB bb:
}
struct stA aa:
0330デフォルトの名無しさん
NGNGそのレベルなら好きにすれば?(´ー`)y-~~
0331名無しさん@XEmacs
NGNGロック変数は、ロックする対象と一対一に対応させて利用しさえすれば、
対象となる構造体の一部である必要はない。
struct T a;
pthread_mutex_t lock_for_a;
でもよい。
>>317,>>319-320
どうしてそうなるかは、Windowsの仕様ではなく、
Windowsの実装や動作環境に依存する話だから、
そんな物に依存しない様に同期を取りながらプログラムを記述せねばならない。
> 重たいループに優先的にCPUが使われてしまう、と考えていいのでしょうか?
そういうことはない。Busy loopがCPUを占有するだけ。
0332デフォルトの名無しさん
NGNG>>331
ご返答ありがとうございます。なるほど、ロック対象の対応をきちんとすれば
ロック変数の宣言はどこでもいいんですね。しかし一つ疑問が生じます。
pthread側はどこでロック対象のスコープ範囲を知る事ができるんでしょうか?
2つのスレッドAとBがあったとき、AがロックしたリソースをBは解放されるまで
アクセスできないとしたときに、Aがロックするものというのは何でもよいわけですよね?
構造体のインスタンスでも、一つの変数でも、構造体のリンクリストのずっと先の方でも…
ロックされる範囲をBはどのようにわかるのでしょう?
それとも単にAがソースコード中でロックとアンロックをした範囲内のデータは全て
ロックがかかるという事でしょうか?(つまりソースコード依存)
その間に構造体メンバーやグローバル変数が出てきたらそれらは全てロックがかかる
のでしょうか?
0333超先生@プログラム板
NGNG< `ш´>.。oO(C言語のスコープは関係しない)
pthread_mutex_lockにて明示的にロックし、
pthread_mutex_unlockにて明示的にアンロックする。
保護がかかるのはあくまで*コード*であり、直接データが保護されるのではない。
データにアクセスするコードをmutexで保護することによって、
データへのアクセスがアトミックであることを保証することができるのだ。
0334デフォルトの名無しさん
NGNG>>333
どうも勘違いして mutex lock を理解していたようです。これで疑問が氷解しました。
ありがとうございました。m(__)m
0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNG「Win32マルチスレッドプログラミング」を読むと1つのデバイスコンテキストに
複数から描画するのはまずい、とあり、実際、プライマリスレッドが
作ったデバイスコンテキスト(hDC)に別スレッドからアクセスしても
フォント情報、背景色など、正しく情報を持って来れません。
やりたいことは、TRACE()の結果をIDEではなく、別Windowsに表示させる、
といった感じになのですが。
0337デフォルトの名無しさん
NGNGhttp://www.sysinternals.com/
0338デフォルトの名無しさん
NGNGPostMessageでUIスレッドにメッセージ投げれ。
UIスレッドでは、そのメッセージをうけて、何か描画すれ
0339デフォルトの名無しさん
NGNGあとpfintf()はリエントラント? デバッグように出したりしてるんですが
0340デフォルトの名無しさん
NGNGどうしてもつかいたければ単体の乱数発行スレッドでメッセージ通信とか
すれば良いと思う。
printfはふつー再入可能じゃないのかなあ。まあ処理系に依存するよ。
0341デフォルトの名無しさん
NGNGリエントラントでないならロックすれば言いだけじゃないの?
0342デフォルトの名無しさん
NGNG>>340
別スレッド作るのはいやん
>>341
そうかロックしちゃえばいいのか
0343名無しだけれども
NGNG> あとprintf()はリエントラント? デバッグように出したりしてるんですが
printf()はstdoutが共有リソースだから、
競合するようなら排他せざるを得ないでしょう。
printf()毎にライブラリがジャイアントロックする環境なら、
アプリ作成者がやる必要はないけど。
(ただしそのことをリエントラントとは呼ばない。MT-Safeではあるが)
fprintf()であれば、出力先が違う場合があるわけだから、
MT-Safeでかつリエントラントである実装が最近は多いはずだけど。
いずれにせよ、使っている環境のマニュアル読むこと。
func () { // MT-Safeではあるが、リエントラントとは言わない。
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; // ジャイアント
pthread_mute_lock(&lock);
ほげほげ;
pthread_mute_unlock(&lock);
}
0344デフォルトの名無しさん
NGNGとかいってみる。l
0345デフォルトの名無しさん
NGNG対戦テトリスとか。
0346デフォルトの名無しさん
NGNGさせる良い方法ないですか?
0347名無しとは?
NGNG> そのスレッドを強制的に終了させる
極めて有害。
0348デフォルトの名無しさん
NGNG言語は合ってるのか?w
0349デフォルトの名無しさん
NGNG一定時間止めておきたい場合はどうするの?
pthread_mutex_lockで待つのはいいとしても。
0350デフォルトの名無しさん
NGNG>>348
ptheadでもなんでもいいです。一般的にどうするのがいいのかなと…
やりたいのは一定時間眠らせておきたい(止めておきたい)んだけど
終了させたい時にはすぐにそのスレッドを終了させたい。
pthread_mutex_lock()の場合ロックハンドルを待つということは別途
一定時間を計るタイマーを持てと?タイマースレッドの実装って美ジ
ーループでしょ?やだな。
0351デフォルトの名無しさん
NGNG無ければptherad_cond_timedwait
0352デフォルトの名無しさん
NGNG0353名無しとは?
NGNG1. pthread_cond_*()を使う
2. 通知する側が条件を調べて真の時に通知するようにする。(condと基本的に同じ)
3. 条件を調べて通知するthreadを作る。
0354デフォルトの名無しさん
NGNG0355デフォルトの名無しさん
NGNGFreeBSDの<pthread_np.h>に以下の関数が宣言されています。
int pthread_attr_setcreatesuspend_np __P((pthread_attr_t *));
int pthread_multi_np __P((void));
int pthread_resume_np __P((pthread_t));
int pthread_single_np __P((void));
int pthread_suspend_np __P((pthread_t));
int pthread_mutexattr_getkind_np __P((pthread_mutexattr_t));
int pthread_mutexattr_setkind_np __P((pthread_mutexattr_t *, int));
void pthread_set_name_np __P((pthread_t, const char *));
int pthread_switch_add_np __P((pthread_switch_routine_t));
int pthread_switch_delete_np __P((pthread_switch_routine_t));
int pthread_main_np __P((void));
これらの関数が何をするものなのか知っていたら教えて下さい。
0356デフォルトの名無しさん
NGNG後に_npついてるのはPOSIXに規定されてないと思う。
0357デフォルトの名無しさん
NGNG今、MSのFreeBSD向けCLIがLinuxでも動作するよう移植してるんですが、
PALのスレッドの辺りが上手く動かないからちと困ってます。
FreeBSDのmanpageにもでてこないし、検索してもまったく引っかからないし
やっぱりソース読むしかないかなぁ。。
0358名無しとは?
NGNG_npってのは、NOT POSIX。
だからpthread_np.hってのは、pthread関連ではあるが、
POSIXのpthread規格に入ってない関数等のheader。
// pthread_*_npって命名自体POSIXに規定されてるんじゃなかったかな。
0359デフォルトの名無しさん
NGNG_npはnot portableだと思ってたが。
0360デフォルトの名無しさん
NGNG0361デフォルトの名無しさん
NGNGイカれたメモリコントローラの下では、
「まったく同時に同じところにアクセス」しなくとも、
メモリが煙を吐いて壊れるのは予想しうる事ではないでしょうか。
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNG0364デフォルトの名無しさん
NGNG0365デフォルトの名無しさん
NGNG0366デフォルトの名無しさん
NGNG0367デフォルトの名無しさん
NGNG>>361さんの書き込みで安心してたんですが、
これも意地悪なのですか。
0368デフォルトの名無しさん
NGNG0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNGウソはよくないぞ
0371デフォルトの名無しさん
NGNG0372名無し人間
NGNG・"one writer, some readers"
・atomic
・cache coherent
って概念を勉強して自分で考えられる人間になるか、さもなくば、
自分の知りたい場合について詳しく説明しながら質問すること。
0373デフォルトの名無しさん
NGNGそれらを勉強するのに適した書物等あれば、おせえてください
0374デフォルトの名無しさん
NGNG0375デフォルトの名無しさん
NGNG0376名無し人間
NGNGhttp://www.amazon.co.jp/exec/obidos/ASIN/482228056X/qid=1020141523/sr=1-1/ref=sr_1_2_1/250-4858489-2345044
とりあえずこれ。
後はタンネンバウムかなー。(良書とは言えないけど…)
http://www.amazon.co.jp/exec/obidos/ASIN/4894710471/qid=1020141710/sr=1-2/ref=sr_1_2_2/250-4858489-2345044
http://www.amazon.co.jp/exec/obidos/ASIN/4894712245/qid=1020141710/sr=1-4/ref=sr_1_2_4/250-4858489-2345044
0377デフォルトの名無しさん
NGNGJavaスレッドプログラミング―並列オブジェクト指向プログラミングの設計原理
http://www.amazon.co.jp/exec/obidos/ASIN/4881359185/250-7376397-1451448
0379デフォルトの名無しさん
NGNG0380デフォルトの名無しさん
NGNGWinsockAPIを使おうと思うんですが、
これってWSA~ 以外の関数もMT-Safeなのですか?
MT-Safeのこともよくわかっていないので、もしよろしければ、
MT-Safeの定義を教えてください。
0381デフォルトの名無しさん
NGNGへー、WindowsでもMT-Safeっていう概念あるんだ。
SolarisでMT-Safeと言ったら、複数のスレッドから同時に呼び出しても
安全で、かつそれなりのconcurrencyで動くことを言う。
全体をロックしちゃって、1度に1つのスレッドしか入れないように
なってるやつは「Safe」と呼ぶ。
0382デフォルトの名無しさん
NGNG0383デフォルトの名無しさん
NGNG0384デフォルトの名無しさん
NGNGおお。ありがとうございます。
複数のスレッドで安全に動けばとりあえずMT-Safeということですよね?
過去ログでのWinsockのことと、CygwinのライブラリがMT-Safeでないとか、
Googleったら出てきたんで、不安になって聞いてみました。
(MSDN Libraryにも資料ないですし。)
ご教授ありがとうございます。
0386デフォルトの名無しさん
NGNG>へー、WindowsでもMT-Safeっていう概念あるんだ。
ってとこじゃないですか?
おれは>>383じゃないですけど
0387381
NGNGSafe, Unsafe, MT-Safe, Async-Signal-Safe, Fork1-Safe
という分類はSolaris独自かと思ったんですが。
Winでも同じ定義かどうかは正直知りませんです。
0388デフォルトの名無しさん
NGNG複数のスレッドからどんなタイミングで呼び出されても
正常に動作することが保証されていることを指す
0389デフォルトの名無しさん
NGNGそんな説明はmanにありません
0390名無し人間
NGNGhttp://msdn.microsoft.com/vfoxpro/downloads/updates.aspの
「Visual Studio 97 Service Pack」のところ読みなよ。
>>387
> Async-Signal-Safe, Fork1-Safe
それは今関係ないじゃん。
0391デフォルトの名無しさん
NGNGミューテクスと自動リセットイベントは何が違うのでしょうか。
先生方、どうかご教授を
0392デフォルトの名無しさん
NGNGmutexと同じような動作をすることも、できないわけではない。
おそらく「自動リセットイベント」は、この際に疑似所有権を
譲渡されるタスクを1つに限定する(のでmutexと同じ)と
いうことだろう。
ただそうすると、mutexでは、それを所有しているタスクが
何らかの事情で死亡したときに、所有権がOSにより放棄される
(=他の生きているタスクに渡る)のに対し、Eventによる
疑似所有権は、(放棄が明示でしかありえないがゆえに)
放棄されず、きわめてまずい事態(所有権の喪失=永久待ち)を
引き起こす恐れがあるので、おすすめできない。
民名書房刊、「Auto Reset EventによりMutexは不要か」
0393デフォルトの名無しさん
NGNG先生頭よすぎです!
0394デフォルトの名無しさん
NGNG0395デフォルトの名無しさん
NGNGWindowsはスレッドが途中で氏んでもMutexを開放しない罠。
0396デフォルトの名無しさん
NGNGだれかおしえてくらさい。
0397デフォルトの名無しさん
NGNG0398デフォルトの名無しさん
NGNGやはりそれしかないか・・・
ためしたんだけど、longjmpしたあとのreturnとかがうまくいかないです。
0399デフォルトの名無しさん
NGNGんじゃ、タイマ割り込みを使って自前でコンテキストスイッチ
0400デフォルトの名無しさん
NGNGその場合、切り替えのタイミングは大麻割り込み??
0401デフォルトの名無しさん
NGNG大きく分けてユーザーランドのスレッドと、カーネルサポートのスレッドがある
その中でも実装によって異なるかもしれない(特にユーザーランド)
あとは本などで勉強してね(はぁと)
0402デフォルトの名無しさん
NGNG「うまくいかない」とだけ書かれてモナー。
とりあえずvolatileが必要に1000setjmp。
0403デフォルトの名無しさん
NGNGというか、setjmp/longjmpがどうやって動作しているのか理解してる?
コンテキストスイッチをsetjmp/longjmpでやるんなら、
まず自前で複数のスタックを確保して、jmp_bufを初期化してやんなきゃ。
とにかく最低限レジスタとスタックの保存と切替ができるようにしないとな。
本格的にやるならシグナルハンドラとかマスクとかも考えなきゃならんが。
0404398
NGNG一応生成されたアセンブラコード見てなんとなくは理解しますた。
だけど、コンテキストスイッチとかサパーリです。。。
まだまだ勉強不足です。
出直してきます。
レスくれた人ありがとう
0405test
NGNG文章からすると小学生くらいだと思うが、答えてやろう。
MS-DOSのコマンドではプログラムは作れません。
Javaでも、VC++でも使えば幾らでもスレッドプログラミングできます。
GUIを出したくなければ、GUIを使わなければいいだけで無関係。
0406デフォルトの名無しさん
NGNG痴呆
0407デフォルトの名無しさん
NGNGちゃんとWAIT_ABANDONEDで帰ってくるが。
クリティカルセクションなら解放しない。
0408フォルトの名無しさん
NGNG気が狂ったように宣伝しています。
http://www.microsoft.com/japan/sql/choice/
並列処理ではマルチプロセスよりマルチスレッドの方がすべての面で
優れていると主張しています。で、最後にOracleよりMS SQLのほうが優れてる
と書いています。ヒャッヒャッヒャ。
マルチプロセス・マルチスレッド・マルチファイバ・ステートプログラミング、
どれが優れているのか・開発しやすいのか、語ってください。
0409デフォルトの名無しさん
NGNGひたすらダーティーに。
0410デフォルトの名無しさん
NGNGそういう場合、Oracleより劣るところはどこか聞いてみると良い。
0411デフォルトの名無しさん
NGNG0412デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNG設計のコードをデバグさせられそうになったのですが
逃げました
0415デフォルトの名無しさん
NGNGた。まあ,プロジェクトとしては助かったけどね。
0416デフォルトの名無しさん
NGNG0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNGめでたくプロジェクトは潰れました
0421デフォルトの名無しさん
NGNGスレッドよりはコルーチンで作りたくなることが良くある。
0422デフォルトの名無しさん
NGNGIOCPの俺様実装とかできそうな感じ
0423デフォルトの名無しさん
NGNG0424おぱい
NGNGError: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照)
のエラーが出ます。
ソースは実験のためのシングルスレッドのスケルトンです。
bcc32 -W test.cpp
ではコンパイルできます。
DLLのソースなら
bcc32 -WD dll.cpp
でコンパイルできました。
スケルトンで
bcc32 -WM test.cpp
で、'_main' が未解決っていうことは、マルチスレッドならWinMain()
じゃなくて、別の関数名なんですか?
0425名無し人間
NGNGWinMainって一体なんなのか調べてみれ。mainとの違いを。
0426おぱい
NGNGって注意されていると思ったから、ハローワールドの
ソースで、bcc32 -WM hello.cpp
ってやったらコンソールのマルチスレッドがコンパイルできました。
32ビットコンソールなら
bcc32 -WC hello32.cpp
でできました。
BCC5.5では32ビットマルチスレッドのアプリは作れないんですか?
0427デフォルトの名無しさん
NGNGボーランドに聞けよ...
0428おぱい
NGNG0429おぱい
NGNG板ごと削除依頼しよっか?
0430デフォルトの名無しさん
NGNG必死だな。
0431デフォルトの名無しさん
NGNG0432sage
NGNGって注意されていると思ったから、ハローワールドの
ソースで、bcc32 -WM hello.cpp
ってやったらコンソールのマルチスレッドがコンパイルできました。
32ビットコンソールなら
bcc32 -WC hello32.cpp
でできました。
BCC5.5では32ビットマルチスレッドのアプリは作れないんですか?
激しく( ´_ゝ`)フーン
0433K&R
NGNGおばいくーん、こまるなー、ほんと、いるよねー、こーゆーひと
0434おぱい
NGNGBCC5.5を使ってない人には聞いてないいょぅ。
0435デフォルトの名無しさん
NGNG0436おぱい
NGNGだいたいなー、ボーランドへの質問は18cm未満の人は
質問禁止なんだよ。知りたいならオマエが聞け。
0437デフォルトの名無しさん
NGNGティムポの長さですか?
0438デフォルトの名無しさん
NGNG0439おぱい
NGNGコンパイル時のオプションは必要ないと分かりました。
bcc32 -W test.cpp
で32ビットGUIマルチスレッドもできました。
0440デフォルトの名無しさん
NGNG0441おぱい
NGNGもう用は無い。うせろ。ワラワラ
0442デフォルトの名無しさん
NGNGお願いします。(Win32環境です)
int G = 0;
void init_G(void)
{
if(G == 0) {
if( バージョン判定式 ) G = 1;
else G = 2;
}
}
上記のような場合でもやはり init_G()内の処理は
排他を考える必要があるでしょうか?
複数のスレッドが、あらかじめ init_G()を呼び出した後で
グローバル変数Gを読み取りのみに使います。(書き込みはしません)
また、バージョン判定式 の部分は どのスレッドから
何回評価しても同じ結果を返し、かつ
この判定自体はスレッドセーフであるとします。
同時読み書きや同時書き込みが発生するが、
メモリ上のデータの整合性(一貫性)は保たれるので
排他の必要はない と考えるのは間違いでしょうか。
0443デフォルトの名無しさん
NGNG考え方はあっている。
書いてあるプログラムも、「いったん判断式を評価したら、二度と評価しない」
となっているので、その点もよい。
0444デフォルトの名無しさん
NGNG・何回行っても処理に問題はなく
・スレッドセーフであり
・常に同じ値を返す
のであれば、排他制御は必要無い(はず)。
一般には(上記のどれかを満たさないorコストがかかる場合)、Gをvolatileで宣言しておいて
void init_G()
{
if (G == 0) {
lock();
if (G == 0) {
if (...) {
G = 1;
} else {
G = 2;
}
unlock();
}
}
}
のように、初期化が必要になる可能性がある場合のみ、
ロックしてから再度判定する場合が多いと思う。
0445442
NGNGどうもありがとうございます。
基本的な考えは間違っていないようで、安心しました。
> 書いてあるプログラムも、「いったん判断式を評価したら、二度と評価しない」
> となっているので、その点もよい。
この理由がよくわかりませんでした。
私が if(G == 0) を付けたのは、
「判断式を評価する時間がもったいないから」というだけで
深い意味はなかったのですが、
他にも意味があるのでしょうか?
(判断式を何度評価しても動作に支障がない場合)
また、444 さんのコードの意味もよくわかりません。
void init_G()
{
lock();
if(G == 0) {
if (...) G = 1;
else G = 2;
}
unlock();
}
だけではまずいでしょうか?
lock() にかかる時間的コストを考慮?
lock() と unlock() が対になっていない点も疑問です。
0446444
NGNGG==0を2度やっているのは、コストの問題。
本当にlockする必要があるのは最初だけで、それ以降は常にG!=0なのだから、
そのためだけに毎回lockするのは時間的に無駄だから。
例えば、Singletonなんかでインスタンスを初期化/取得する場合でも、
毎回実行する部分は出来るだけ軽くすべきであり、
最初以外はlockせずに値を取得出来るようにするため。
0447444
NGNG>lock() にかかる時間的コストを考慮?
って書いてあった。その通りです。
0448デフォルトの名無しさん
NGNGそのコードだとGをvolatile宣言する必要はナシ。
そもそも、volatile宣言された変数へのアクセスって
意外とコスト高なんで注意すべし。
ちなみに>>444のアルゴリズムはDouble-Checked Lockingと
呼ばれているんだが、場合によってはうまく動かないことが
知られている。
具体的には、初期化の対象がatomicなアクセスが保証されている
primitive型の変数ではなく、緩いメモリモデルを採用している
プラットホーム上で動かした場合に、うまく動かない可能性がある。
緩いメモリモデルの例としてはJava memory modelとかがあるから
参考として以下の記事なんかを読んでおくのもいいよ。
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
0449444
NGNGC/C++でも、volatileは必要無いのかな?
つまり、lockした後の再判定時に、コンパイラの最適化で
レジスタ等にキャッシュされた値を読んでしまうのを防ぐ必要があるかなと。
コスト的にも、C/C++なら、スタック以外の変数(の読み出し)にかかるコストは、
volatileでもそう変わらないと思ったし(読み出しが一回だけの場合)。
Javaなら、インスタンス変数をキャッシュする関係で差がつくのはわかるけど、
>>444は元々C/C++を想定していたから。
ただ、スタック上の変数の場合は、C/C++でもレジスタ割り付けの関係で差が付きそう。
あと、問題があることは知らなかった。
操作対象がatomicに操作できなくても、判定するためのフラグを用意すれば
一般的に解決できる問題なのかな?
とりあえず、リンク先読んでみる。
0450444
NGNG・コンストラクタが実行されて初期化されるまでの間
・(C/C++などのCPUキャッシュの同期が保証されていないものでの)メモリからの読み出し時
に問題があることはわかった。
その他はまだよく理解出来てないけど。
0451442
NGNGどうもありがとうございます。
おかげ様で大変よくわかりました。感謝感謝です。
今度は
>>448の
volatile宣言の必要がないというのがわかりません。
(444さんと同じ考えですが) volatileが無いと、
lock とunlock が通常の関数呼び出しとして実装されている
なら大丈夫としても、
仮にこれらがインライン展開される関数やマクロだった場合に、
・lockの直後のif文で G がメモリから再ロードされるかどうか
・更新後の Gの値がunlockの前でメモリに書き込まれるかどうか
が保証されないのでは? と思えます。
0452デフォルトの名無しさん
NGNGたとえば
mutex L;
int data;
として、スレッドAで
lock(L);
dataに代入; // …(1)
unlock(L);
とした後、スレッドBで
lock(L);
dataの利用; // …(2)
unlock(L);
ってしたとき、たとえvolatile宣言がなかったとしても
(2)において(1)の変更が見えないのはマズイ。
だから、
> 仮にこれらがインライン展開される関数やマクロだった場合に、
> ・lockの直後のif文で G がメモリから再ロードされるかどうか
> ・更新後の Gの値がunlockの前でメモリに書き込まれるかどうか
> が保証されない
なんてことがあったら、それはスレッドライブラリ側のバグ。
さらに、緩いメモリモデルをとっているアーキテクチャ上の
スレッドライブラリではlock, unlockの際に適切なメモリバリア命令を
実行していたりもする。
IA-32ではメモリ書き込み順やキャッシュ一貫性の保証があるんで
こういう話とはほとんど無縁だけど、pthreadの本とかでは
ここらへんが重要な話として載ってるよ。
0453名無し人間
NGNG> それはスレッドライブラリ側のバグ。
> さらに、緩いメモリモデルをとっているアーキテクチャ上の
> スレッドライブラリではlock, unlockの際に適切なメモリバリア命令を
> 実行していたりもする。
これは標準Cから逸脱している特定のシステムの話では?
0454デフォルトの名無しさん
NGNG当然逸脱してるけど、それを満たしていなかったらスレッドライブラリとして
使い物にならないって言う事じゃないの?
違ってたらスマソ
0455お役立ちサイトです。
NGNG究極の総合リンク集
http://home9.highway.ne.jp/cym10262/
0458442
NGNGなんとなくわかりました。
たとえvolatileがなくても、lock/unlock の前後では必ず
メモリに反映されるような実装になっている(はずである)。
ということですね。
どうもありがとうございます。
0459452=448
NGNGちょっと言い過ぎだったかもしれんが、
もしvolatile宣言が必要な処理系があったとしたら、
>>454の言うように「スレッドライブラリとして
使い物にならない」のは確か。
ポインタをvolatileと宣言しても、その指し示すデータは
volatileにならない(ちょうどconst宣言と同じ)から、
リストとか木とかちょっと大きめのデータ構造を
ロックしようとしたときにえらく面倒になってしまう。
0460デフォルトの名無しさん
NGNG0461デフォルトの名無しさん
NGNG誰もそんなこと言ってませんが?
0462デフォルトの名無しさん
NGNGハンドラというけど)型の変数や、pthread_cond_t型の変数を他のint型やchar型
のデータ構造体の中にいっしょに詰め込んでmallocして使ったらメモリー破壊
されまくり。ポインタにして分けてmallocしたらうまく動きますた。
何故何故??
0463デフォルトの名無しさん
NGNG0464デフォルトの名無しさん
NGNGマルチスレッド処理が必要なときって何?
0466デフォルトの名無しさん
NGNGpthread_t
pthread_cond_t
だけ?
pthread_mutex_tがなきゃpthread_cond_tは意味を成しませんが。
どのような使い方をしているのか理解出来ないのですが・・・
0467デフォルトの名無しさん
NGNG必要な例:
いわゆるUNIXでは、fd(pipe/socket等)のポーリングと、sysv IPCの同期待ちと、
プロセス終了待ちと、pthreadの同期待ちを単一のスレッドで同時にはできない。
これは個別にスレッドを立てるしかない。
これ以外は再利用の都合じゃないでしょうか。
独自のループを持つ既存のモジュールを使いまわせるとか。
0468デフォルトの名無しさん
NGNG467の他に「CPUが複数あるマシンで速く計算するため」というのもあるな。
0469デフォルトの名無しさん
NGNGhttp://slashdot.jp/article.pl?sid=02/09/11/0131222&mode=nested
0470デフォルトの名無しさん
NGNG0471デフォルトの名無しさん
NGNGhttp://slashdot.jp/article.pl?sid=02/09/11/0131222&mode=nested
0472デフォルトの名無しさん
NGNG0473デフォルトの名無しさん
NGNGXEON買え、買えないなら諦めろ。
以上
0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNG質問の意味がわからん・・・
0477デフォルトの名無しさん
NGNGpthread_mutex_t 型のmutex変数を2つ以上使う場合ってどんな場合なのかなと
思いまして質問しました。
0478デフォルトの名無しさん
NGNGリソースが複数ある時とか。
セマフォと同じ用途。
0479デフォルトの名無しさん
NGNG0480デフォルトの名無しさん
NGNG0481デフォルトの名無しさん
NGNG確かにアタマが割れるようにイタイ!!!!
それはヘッドロック
てへ★ミ
0482デフォルトの名無しさん
NGNG> sysv IPCの同期待ちと、
> プロセス終了待ちと、pthreadの同期待ちを単一のスレッドで同時にはできない。
スレッドを使わずとも、selectや、sigactionを使って同期を取れますが・・?
> これ以外は再利用の都合じゃないでしょうか。
> 独自のループを持つ既存のモジュールを使いまわせるとか。
その糞モジュールが本当にスレッドでまともが使えるのか結構疑問にかんじますが。
>>486
> 467の他に「CPUが複数あるマシンで速く計算するため」というのもあるな。
た、たとえばどんな?
計算させたって、計算終わるまで結果待ちしてるヤシがいるのはずだけど、そいつは何してるの?
画面描画?画面描画のための計算処理が重いのではないのか?
「Windowsプログラミングでメッセージ処理とソケットの同期がスレッドでないと取れない」ぐらいしか漏れには思いつかない。
0483デフォルトの名無しさん
NGNG0484デフォルトの名無しさん
NGNGと思い、-pg付きでコンパイル・実行してみたのですが、gmon.outが出力されません。
プログラムは、^Cで止めるまで動き続けるものです。どうやらexit()がgmon.outを書き出す
らしいとわかったので、sigactionでSIGTERMをハンドルするようにしましたが、駄目でした。
なにか知恵をください。
0485484
NGNGSIGTERMはSIGINTの誤記です。ちなみに^Cではなく、
killall -INT program_name にしてます。
0486デフォルトの名無しさん
NGNGpthreadはよく知らんのだが、
#include <stdio.h>
#include <signal.h>
void h(int x){ exit(1);}
int main(void){ signal(SIGINT, h); while(1); return 0; }
漏れの環境では、single threadの上のは^Cでgmon.out出る。
0487484
NGNG似たようなコードでも、MTにしたとたん出ないです。
0488デフォルトの名無しさん
NGNGこのバカに教えてください。
0489デフォルトの名無しさん
NGNG0490デフォルトの名無しさん
NGNG失せろバカ。
0491デフォルトの名無しさん
NGNGお前が消えろ
0492デフォルトの名無しさん
NGNGバカに理解させるのは疲れるのでいやです
0494484
NGNG0496デフォルトの名無しさん
NGNGあるアプリケーションが h0番地からhn番地までのメモリを使える時、
h0番地~hn番地までの範囲が、そのアプリケーションのアドレス空間。
プロセスp1とプロセスp2のアドレス空間は全く重ならないけど、
スレッドt1とスレッドt2のアドレス空間はぴったり一致する。
0497488
NGNG?
アドレス空間が完璧ってどういうことですか?
0498488
NGNGありがとうございますm(..)m
禿しく理解できました。
ついでにこれも聞いていいですか?
本を読んでWIn95はプリエンティブなマルチタスクでは無いとかなんとか
と書いてありました。
これはどういうことですか?
0499>>498
NGNG今さらそんなことが書いてある本があるのか?
Win95はプリエンティブなマルチタスクですよ。
つーか、ム板民なら、そのくらい解れ。
0500デフォルトの名無しさん
NGNGa(形容詞). 先制(攻撃)の; 先買権のある. preemptively ad(副詞).
投機実行があるという意味でしょう。
メモリに存在している複数のスレッド(一部は特定の仮想マシンを共有している)
間の投機実行が行われるという意味。実行中のスレッドを一時停止させ
別のスレッドを投機実行させる。non-preemptiveな場合はそういうことは
ない。ま、win3.1にはスレッドという概念すら無いに等しいが。
0501デフォルトの名無しさん
NGNG0502デフォルトの名無しさん
NGNG0503デフォルトの名無しさん
NGNG0504デフォルトの名無しさん
NGNGWin9xはプリエンティブなアプリとノンプリエンティブなアプリが
混在するから、不完全なプリエンティブマルチタスクと言われていたはず。
0505デフォルトの名無しさん
NGNG遅レスだが・・・
MsgWaitForMultipleObjectsとWSAEventSelect使えばメッセージ待ちながらソケット待てるよ。
Win32だとWSAEVENTは単なる手動リセットイベントだから。
Overlapped I/O使うならMsgWaitForMultipleObjectsExね。
0508デフォルトの名無しさん
NGNGLinuxデス
0509デフォルトの名無しさん
NGNGlinuxのpthreadってなんか使いにくくてしょうがない
0510デフォルトの名無しさん
NGNG自由にぼやいて貰って構わないんだけど、
「Winなスレッド」って生CThreadのこと?
0512デフォルトの名無しさん
NGNGキモイ関数が沢山ありそうだね
0513デフォルトの名無しさん
NGNG0514デフォルトの名無しさん
NGNG0515純スレ
NGNGおお そんなものがあるのですが、Win厨で失礼いたしましたぁ!_O_
しかし、ますますマルチスレッドプログラミングの必要性を見失いつつあり…。
最近はマルチスレッドプログラミングで苦悩している人を見ていると、とてもかわいそうなわけで…。
0516デフォルトの名無しさん
NGNGマルチスレッドプログラミングは、やればやるほど
スレッドを減らす方向に設計したくなるという面白い側面がありますね
0517デフォルトの名無しさん
NGNGならないという事なんですが、CloseHandle() を呼び出す位置は
_endthreadex() が (明示的もしくは暗黙的に) 呼ばれる前、呼ばれた後の
どちらでも構わないんでしょうか。
0518デフォルトの名無しさん
NGNG不要だったら生成直後にcloseしてもよい
0520デフォルトの名無しさん
NGNG諸兄の知恵を貸してください。
現在、Solarisベースでpthreadを使用したプログラムを作成しています。
これはバックグランドで動作させ、デーモンとして使用するものです。
生成したスレッドの内部では、動的にメモリの獲得・解放を繰り返すのですが、
ps -el でSZの項目を監視すると、数値が増加しつづけてしまい、減少しません。
Purifyもかけてみましたが、リークはありませんでした。
原因を調べるためwebを検索したところ
ttp://www.ncad.co.jp/~komata/c-kouza28.htm
このようなサイトを見つけました。
>スレッド内で動的に多量のメモリを確保すると、プロセスサイズが大きくなり、戻らない
とあるのですが、これは「スレッド内部でメモリを確保しまくるとSZの値は減らない」と
解釈していいのでしょうか?
長文ですいません。
0521デフォルトの名無しさん
NGNGがんがんスレッドを走らせていた。5つくらい。
あるひとりの優秀である(と言われている)人が設計したらしいんだけれど、
ソースコードにコメントが無いし、独自にCOMを実装してる(実装方法はCOMそっくり)
そのくせプラットフォームはWindows限定で、しかもSTLは使ってはいけなくて
……愚痴はやめておこう
さて本題ですが、個人的にはリソースが絡まないのにマルチスレッドにしないで欲しいんだけど、
一体何の理由があってマルチスレッドを利用したんだと思いますか?
部外者の俺が思うに、
・ある程度知識のあるプログラマが自分にしか理解出来ないコードを作ることで、支配基盤をはっきりさせたかった
・過去に作っていた自分のプログラムを再利用したかった(でもコードを見ると多分違う)
・クライアントマシンにマルチプロセッサの時代が来る事を見越していた(これもコードを見ていると多分違う)
・パズルが好きだった。
マルチスレッドをよく使う方々、他になんか理由があれば教えてください。
0522デフォルトの名無しさん
NGNGwindowsということで、STLを使ってDLLとデータをやりとりすると、
ランタイムの関係でメモリ周りで問題が出る場合がある
あんたが差してるリソースの定義が曖昧だ、
CPUリソースもリソースであるという考え方も出来る
要するにお前は死ねって事だ。
0523デフォルトの名無しさん
NGNG今、Windowsで_beginthread()関数を利用して、経験のため無意味にスレッドを走らせています。
しかし、処理があまりにも遅くなるのでちょっと不可解に感じていました。
そこで、ループの先頭にSleep(1);を付け加えたところ、急にスムーズに動きました。
何が原因でこのような現象が起こるのでしょうか?
0524デフォルトの名無しさん
NGNGCPUを使おうとしているから、
OSがその競合を解消しなければならなくなる。
↓
Windowsはそんなに賢くない。
↓
遅い。
Sleep(1);を加えると、OSはアイドルタイムをスレッドに割り振る処理しか
しなくてよいので、負担が減って早くなる。と、てきとうなことを言ってみるテスト。
0525デフォルトの名無しさん
NGNG我儘と傲慢が文中に溢れてるね。
久々に見たイターイ作文だな。
突っ込みどころ満載だけど、一部。
コメントが無いってのは、
「自分じゃ理解出来ないから説明しる」
STL は使ってはいけなくてってのは
「自分は STL バリバリだから使え」
スレッド使う意味があるのかってのは
「私はスレッドについては無知なので
是非使うのを止めて頂きたい」
って事か?
自分より出来る人を陥れる事に夢中になりやがって。
そいつのレベルを越える事に精進しな。
0526デフォルトの名無しさん
NGNGその通りかも。精進します。
しかしコメントが無いのはマジで困りました。本当に理解できないのです。
WaitForMultipleObjectsが、一体どのリソースを待っているのか確認するのは大変でした。
STL使っては行けない理由はサイズが大きくなるからだそうです。
MFCのCArrayとかを使いなさいと言われました。
スレッドを使う意味があるのかってのは、本当に解らなかったからです。
どんなクライアントかを簡単に言うと、ドロップされたjpeg画像を読み込んで、
それを横一列にサムネイルで表示するだけのプログラムでした(その当時は)。
その後、ネットから画像を読み込む様に対応させる方向にするのかもしれないですね。
その意味では予めマルチスレッドで実装させる必要があるのかもしれません。
ちょっと厨房な質問スマソでした>ALL
0527デフォルトの名無しさん
NGNGbgで作成してないとアプリが固まったようになってしまう
って事じゃないの?
0528525
NGNGをっ、マジだったのね。きつぃ言動スマソ。
使う、使わないの理由聞いてんじゃん。
2ちゃんで聞くより、本人(SE)が暇そうな時に
もっと直接聞いたほうが間違いないと思うけどな。
まぁ、いろんな意見を集めた方がいいけど...
0529デフォルトの名無しさん
NGNGそれだけでもないみたいです。というのも、別にサムネイルを作るところを
別スレッドにしているわけではなくて、ただサムネイルを表示する
GUIの部分の、独自メッセージのやりとりをしている部分がマルチスレッドでした。
例えば、何もないダイアログを作り、そこにボタン、スクロールバー、
エディットボックス、などなどを追加していきます(プログラムで)。
で、一斉にそれらがマルチスレッドで処理を始めるという具合です。
それぞれ普通にプロシージャを使ってWindows任せで処理すればいいと思うんですが…。
>>523
多分、他のスレッドと同期を取って計算しているんだと思うけれど、その同期の取り方が
適当なグローバル変数などを使ってやってるのではないでしょうか??
例えばスレッドAでflag=1にすると、スレッドBの処理がはじまる、というような場合、
スレッドBでは、while(flag!=1); みたいに待機しているんだと思います。
その時に、一度flag!=1を確認すれば、すぐに別スレッドに処理を移すべきなのだけれど、
もちろんOSではそんなことはわからず、ある一定の決められた期間スレッドBでは
ひたすらflag!=1を評価し続けます。この時間はまるまる無駄です。
そういうタイミングでSleep(0)を入れてやると、すぐに別スレッドに処理が移るので、
効率的にCPUを使うことが出来る、という現象だと思います。
(この場合、Sleepは1でなくて0で問題ないはずです)
どうでしょうか?
0530デフォルトの名無しさん
NGNGそいつはやる気のある天才だな。
自分よがりとはいえ、そこまでの技術を「たかが」仕事で使ってしまう辺り、
自分の仕事に自信があり、その会社でも正当な評価を受けてる証拠だろう。
そういうコードはめったに見れないから、素直に見習ったほうが良いぞ。
ここで聞かずに、その天才に聞けよ。(なんで本人に聞かない?)
0531デフォルトの名無しさん
NGNG> そういうタイミングでSleep(0)を入れてやると、すぐに別スレッドに処理が移るので、
> 効率的にCPUを使うことが出来る、という現象だと思います。
> (この場合、Sleepは1でなくて0で問題ないはずです)
「マルチスレッド 同期」あたりで、一回グクッてみることをお勧めする。
0532デフォルトの名無しさん
NGNGEventかFiberを覚えよう
0533デフォルトの名無しさん
NGNG間違ってないんじゃね?
Sleepせずにビジーループで変数待機してると
割り当てCPU時間全部使うまでCPU解放しないわけだし。
0534デフォルトの名無しさん
NGNGWindowsにはウィンドウメッセージという機構があるんだから
ぜひともそれを使っていただきたいものです
下手に俺様キューを作るよりよっぽどマシです...
0535デフォルトの名無しさん
NGNG> 間違ってないんじゃね?
別に間違っているとは言っていない。そもそも...
>> 例えばスレッドAでflag=1にすると、スレッドBの処理がはじまる、
に対して...
>> スレッドBでは、while(flag!=1); みたいに待機しているんだと思います。
なんてことは普通しない。素直に、Event ととか使えば、スレッド B は待ってる間全然 CPU を使わない。
0536デフォルトの名無しさん
NGNG該当スレッドにウインドウが無い可能性もあるだろ
あと、WindowsのメッセージはHWND指定がついてくるのが気持ち悪い。
素直にイベントに汁
0537デフォルトの名無しさん
NGNGウィンドウがなくてもメッセージキューとして使えることを
知らないアフォが多すぎ
0538デフォルトの名無しさん
NGNG勿論知ってますが。
GetMessageでHWNDの指定を強制させるのが嫌すぎというだけです。
非同期ソケットとか、トレイアイコンにも言えることですが。
0539デフォルトの名無しさん
NGNGMSGにhwndが入っているんだから、それで良いじゃないかってだけです。
0540デフォルトの名無しさん
NGNGヘルプもロクに読めないとは・・・
0541デフォルトの名無しさん
NGNG受け側スレッドがGetMessageで受けるんでしょ。
それでメッセージキューが実現できるという話だと思うんだが
何をゴネてるの?
0542デフォルトの名無しさん
NGNG勿論知ってるっつーの
GetMessageにHWNDがあるのが気に入らないだけ
0543デフォルトの名無しさん
NGNG0545デフォルトの名無しさん
NGNG> それぞれ普通にプロシージャを使ってWindows任せで処理すればいいと思うんですが…。
何故いいと思うのか根拠書かないと。
GUIスレッドを自前で持つなんて、
Look&Feelのレスポンスが重要な局面ではよくやることだよ。
何も不思議なことはやってない。(少なくとも提示されている条件内では)
それよりも君の>>521の姿勢がずっと疑問。
AFCのスレッドモデルについてちゃんと理解してるの?
0546デフォルトの名無しさん
NGNGMainThread:
0547デフォルトの名無しさん
NGNG>>521
>さて本題ですが、個人的にはリソースが絡まないのにマルチスレッドにしないで欲しいんだけど、
これ見る限り素人だし相手にしても無駄だよぅ
0548デフォルトの名無しさん
NGNG>>545
MainThread: ダイアログを作る -> サブスレッド起動
Sub1: ボタンのメッセージを処理
Sub2: スクロールバーのメッセージを処理
Sub3: エディットボックスのメッセージを処理
って事じゃないの?
>で、一斉にそれらがマルチスレッドで処理を始めるという具合です。
こう書いてあるし
0549デフォルトの名無しさん
NGNG読み間違いに一票。
単に521が仕事できないだけだろ。
0550デフォルトの名無しさん
NGNG>スレッドBでは、while(flag!=1); みたいに待機しているんだと思います。
こんな事考えてる様なやつだしね(w
0551デフォルトの名無しさん
NGNGそれは523があまりにも初心者だから、そう推測したんじゃないのか?
と、擁護してみる。
0552デフォルトの名無しさん
NGNG> >スレッド内で動的に多量のメモリを確保すると、プロセスサイズが大きくなり、戻らない
ここの、
> とあるのですが、これは「スレッド内部でメモリを確保しまくると
> SZの値は減らない」と解釈していいのでしょうか?
「スレッド内で」はあってもなくても同じ。(古典的UNIXとC(++)では)
単純ヒープモデルのメモリ管理は一度でかくなったら元に戻らない。
brk(2)を小さくするために呼び出すことはない。
// 「スレッド内で」と書いてあるのは、プロセスからの類推で、
// スレッドが終了したら、利用していたメモリも
// 解放されると誤解する人がいるからでしょう。
理由は、malloc(3)したメモリオブジェクトの位置を変えられないので、
羽抜け状態になるからです。emacsでは可変長オブジェクト用ヒープの
コンパクションをして、巨大化を防いでいます。
(それでもいったん大きくなるとそのまま)
話せば非常に長くなるので、
http://www.saiensu.co.jp/books-htm/ISBN4-7819-0303-7.htm
の「動的な記憶割り付け」を。さらに進むには、
http://www.google.com/search?q=garbage%20collection%20site%3Aamazon.co.jp&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8
でも読んでください。英語読めるなら、これも。
http://www.amazon.co.jp/exec/obidos/ASIN/0471941484/qid=1033055505/br=1-1/ref=br_lf_fb_1/249-2956017-1293960
"w3m"のweb pageとドキュメントも参考になるかも。
ちなみにthread関係ないから、
この話題続けるならUNIXプログラミングスレに。
0553デフォルトの名無しさん
NGNG0554デフォルトの名無しさん
NGNGエロゲーやりながらオナニーしたいときとかだね。君の場合。
0555デフォルトの名無しさん
NGNGマ板へどうぞ
0556デフォルトの名無しさん
NGNG嗚呼、無能なヤシは困る…
505をお読みになったか?
0557デフォルトの名無しさん
NGNG0558デフォルトの名無しさん
NGNGWaitFor〜じゃメッセージ待機できない。
できるのはMsgWaitFor〜だよ。
それでもメッセージの取得はできないが、メッセージが届いている事を
前提にできるから、GetMessageでブロックせずに取り出せる。
0559デフォルトの名無しさん
NGNGGetMessageが気に入らないんじゃなくてHWNDが嫌いなんだから、
PeekMessageも当然ダメだろ。
0560HWND
NGNG僕だって困ってるんです。隠居して、田舎暮ししたい…
0561デフォルトの名無しさん
NGNGだめとか言ってるんだから単なる言いがかりだろ
0562542 じゃねーけど
NGNG> NULL指定してても気に食わないとかいう理由で
> だめとか言ってるんだから単なる言いがかりだろ
言いがかりって...、Windows マンセー野郎様ですか ?
メッセージキューは本来もっと一般的なものだから、基本的には HWND なんてものがいらない素のバージョンの API があって、ウィンドに対するメッセージは、これをラップして使えばいいと思う。
でも、Windows では大多数がウィンドに対するメッセージだから、HWND 付きのメッセージ機構のをウィンド無しでも使えるようにしたという実装も理解できなくは無い。
俺はそう言う実装は嫌いだけど、それ以外の利点が大きいから Windows を使う。ただそれだけじゃないの ?
0563デフォルトの名無しさん
NGNG0564デフォルトの名無しさん
NGNG使うもなにも、用意されてる選択肢がそれしかないんですけど。
0565デフォルトの名無しさん
NGNG0566552
NGNGがーん、コピペ失敗した…
> さらに進むには、
> http://www.google.com/search?q=garbage%20collection%20site%3Aamazon.co.jp&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8
> でも読んでください。
これです。
省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集
http://www.amazon.co.jp/exec/obidos/tg/detail/-/books/4894714086/glance/249-2956017-1293960
省メモリシステムに限らず、メモリ管理全般に有用です。
0567デフォルトの名無しさん
NGNGわざわざ気に入らないからって、スレッド対応のメッセージキュー作るの?
0568デフォルトの名無しさん
NGNG>Windowsにはウィンドウメッセージという機構があるんだから
>ぜひともそれを使っていただきたいものです
>下手に俺様キューを作るよりよっぽどマシです...
そういう風に作ってしまった場合、
ログオンプロンプト(パスワード入力画面)のまま、
ATコマンドやRPCでプログラムを起動したらどうなるの?
これがWindowsのプログラムのヤナ部分。
0569デフォルトの名無しさん
NGNG0570デフォルトの名無しさん
NGNGGUIスレッドと
ATコマンドやRPC発行スレッドを
別にすりゃいいんでないの?
0571デフォルトの名無しさん
NGNGたとえばTVのタイマー録画のソフトを作った場合、
パスワードを入れた状態でユーザーが外出したり
することになるでしょ。
デスクトップを開いていない状態でウインドウハンドル
を操作するAPIを実行するとそこで停止するかエラーになるでしょ。
0572デフォルトの名無しさん
NGNGもしかして、関わらない方が良い?
0573デフォルトの名無しさん
NGNG0574デフォルトの名無しさん
NGNG>>Windowsにはウィンドウメッセージという機構があるんだから
>>ぜひともそれを使っていただきたいものです
>>下手に俺様キューを作るよりよっぽどマシです...
>そういう風に作ってしまった場合、
>デスクトップを開いていない状態でウインドウハンドル
>を操作するAPIを実行するとそこで
HWNDにNULLを入れるからウィンドウハンドルは操作しませんよ?
0575デフォルトの名無しさん
NGNG使ったプログラムは、ログアウトした状態では
使えなくなる欠点があるだろ。
だから、夜間にログアウトした状態で
OLEを使ってエクセルのシートを集計したりできないわけ。
端末の上でしか動かないという制約のあるモジュールは
なんだかな。
0576デフォルトの名無しさん
NGNGNT上で確かめたよ。
サービスの作り方で、停止するかエラーかが決まる。
0577デフォルトの名無しさん
NGNGちょっと飛躍するけど、user32.dllを使ったAPIやつが駄目って事?
0578デフォルトの名無しさん
NGNG0579デフォルトの名無しさん
NGNGそれってMessageBoxとかを出すときの話では?
元はメッセージキューをWindowMessageで代用するという話だったのに、
いつのまにすり替わりましたか?
>>572
あんたするどい
0580デフォルトの名無しさん
NGNG> ハァ?自前でメッセージキュー作れますが?
普通作れるだろ ?
>>567 の言うように普通は、「作らない」けどな。
>>572
俺もそう思う。
0581デフォルトの名無しさん
NGNG使ったこともないくせに想像でモノを書いてるUNIXプログラマ様ですか?
とか>>572の警告を無視して釣られてみる。
0582デフォルトの名無しさん
NGNGHWNDにNULLを指定すればHWNDなんてものはいらないだろ。
お前はほんとにGetMessageの引数にNULLがあるせいで困ってるのかと
小一時間問い詰めたい
単にMSの設計はセンスが悪いって言いたいだけちゃうんかと。
0583間違えた
NGNG0584デフォルトの名無しさん
NGNG> 単にMSの設計はセンスが悪いって言いたいだけちゃうんかと。
ただそれだけだけど ? (つーか、>>562 は普通そうとしか取れないと思うが。)
誰も困ってるなんて書いてない (除く >>560) んですが、妄想ですか ?
0585デフォルトの名無しさん
NGNGつーかね。きみ文章ヘタ。
0586デフォルトの名無しさん
NGNGで、あんたは何言いたいの ?
0587デフォルトの名無しさん
NGNGシステムからダイアログを唐突に出されたら止まるから却下。
0588デフォルトの名無しさん
NGNG0589デフォルトの名無しさん
NGNG0590デフォルトの名無しさん
NGNG>HWND 付きのメッセージ機構のをウィンド無しでも使えるようにした
これのソースキボンヌ。
この挙動は保証されているのかな。
0591デフォルトの名無しさん
NGNGWin32APIスレに移動だな
もはやマルチスレッドとは関係ない
0592デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1032548635/l50
0593デフォルトの名無しさん
NGNGWindowsでGetMessage等を呼ばずにシステム互換のメッセージキューを作る方法教えてくれませんか?
0594デフォルトの名無しさん
NGNG0595デフォルトの名無しさん
NGNGMUTEXをロック
受信側は共有メモリにFIFOバッファを作る。
ポーリング時だけ開放
送信側は送信時にMUTEXをロックしようとする
→相手がポーリグするまでブロックされる。
双方向にする場合は双方でFIFOを持ったうえで
さらにデッドロックしないようにプロトコルを明確化する。
0596デフォルトの名無しさん
NGNG> MUTEXをロック
> ポーリング時だけ開放
> 送信側は送信時にMUTEXをロックしようとする
> →相手がポーリグするまでブロックされる。
それって一個しかデータが入らないから、キューじゃねーじゃん。
普通は、ポーリングする瞬間だけロックして、キューが空だったら何らかの同期機構で待つ。
送信側も書き込む瞬間だけロックして、キューが満杯だったら待つ様に作る。
(普通のキューと同じだと思うが...。)
0597デフォルトの名無しさん
NGNG0598デフォルトの名無しさん
NGNGFIFOだからキューだろうが。普通はリングバッファにするわけだ。
>普通は、ポーリングする瞬間だけロックして、
>キューが空だったら何らかの同期機構で待つ。
つまり、開けて待機することがポーリングなわけだ。
双方向だとデッドロックとかめんどくせぇ問題が起きるから
なるべくサーバー・クライアント型にして、
サービス側リクエストがくるまでずーーと待機というデザインだな。
オレの場合。
0599デフォルトの名無しさん
NGNGつまらないと思うなら無視すればいいだろ
いちいち突っ込むなボケ
0600デフォルトの名無しさん
NGNG無知がほざくなボケ
0601デフォルトの名無しさん
NGNGだれもこれを満たしてない
0602デフォルトの名無しさん
NGNG童貞が吠えるなハゲ
0603デフォルトの名無しさん
NGNGお前らまとめて逝ってよし
0604デフォルトの名無しさん
NGNG禿
・
同
0605デフォルトの名無しさん
NGNG低学歴はすっこんでろ
0606デフォルトの名無しさん
NGNGプッ
ずれてるよ
バーカ
0607929
NGNG> なるべくサーバー・クライアント型にして、
> サービス側リクエストがくるまでずーーと待機というデザインだな。
それは、キューとは言わん。
0608デフォルトの名無しさん
NGNGマジで言ってるのか?
氏ねよボケ
0609デフォルトの名無しさん
NGNG低学歴なお前が死ね
0610デフォルトの名無しさん
NGNGまずお前が死に方の見本を見せろ
0611デフォルトの名無しさん
NGNG二人とも、ちょっと Sleep(100) ぐらいしてこいや。
0612デフォルトの名無しさん
NGNGまずお前が氏ね
0613デフォルトの名無しさん
NGNGやさしくーそだったー じゅもくかほりもいーれてー
このまちでーいちばんー すてきでくらしたーいー
りふぉーむーしようよー しんーにほんーはーうすー
0614デフォルトの名無しさん
NGNG/* pthread_createに渡す関数 */
void* thread_func(void* arg)
{
int* sd = arg; /* sd: ソケットディスクリプタ */
char c;
while (1) {
int result = read(sd, &c, 1);
if (result == 1) {
fputc(c, stdout);
} else if (result == 0) {
usleep(WAIT_MSEC);
continue;
} else {
perror("read on thread_func");
pthread_exit(NULL);
}
}
}
…としています。ソケットにデータが流れてきた時にreadするように書きたいのですが、
usleepを使う以外の方法はありますか?
0615デフォルトの名無しさん
NGNG0616デフォルトの名無しさん
NGNG0617デフォルトの名無しさん
NGNGわたすことができないんですか?
初心者な質問でスマソ。
0618デフォルトの名無しさん
NGNG0619617
NGNG2つ以上のパラメータを渡したかったらどうするんですか?
0620デフォルトの名無しさん
NGNGパラメータのリストを渡す
0621デフォルトの名無しさん
NGNGパラメーター構造体を定義して、mallocして
そのポインタを渡すというのが常套手段ッス〜
0622デフォルトの名無しさん
NGNGというネタが繰り返されるスレはここですか?
0623初心者
NGNG今、エディタにプログラム書いて、コマンドプロンプトでコンパイルしてみたいな
ことしているんですが、マルチスレッドってこんな環境で使えるの?VCのような
開発環境でないとダメ?
0624デフォルトの名無しさん
NGNG開発環境は関係ない。
というか関係があるのかどうか自分で判断できるように努力しる。
0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNGselect知りませんですた(´・ω・`)ショボーン。ありがとう。
0627デフォルトの名無しさん
NGNG0628デフォルトの名無しさん
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1006617496/l50
0629デフォルトの名無しさん
NGNGほざくな
0630デフォルトの名無しさん
NGNGマジレスするとどっちも重要。
実践して壁に当たってから理論せれ。
壁に当たらんと、理論のありがたさがわからん。
0632デフォルトの名無しさん
NGNGスレッドをいくつか作成して、
メインスレッドが各スレッドにPostThreadMessage、
サブスレッドはGetMessageでそれを捌く。
これを数万〜数十万オーダー繰り返すとたま〜にGetMessageがデッドロック起こす現象に悩まされたことがあるんだけど、
他にそんな人いる?
すっごいシンプル(100行未満)なテストプログラムでも起こったんで、何か原因があるとは思うんだけど見当つかなかった。
0633デフォルトの名無しさん
NGNG再現するソースは?
0634デフォルトの名無しさん
NGNG構造体のポインタか、クラスのポインタわたせば?
0635デフォルトの名無しさん
NGNGs/構造体のポインタ/構造体のインスタンスのポインタ/
s/クラスのポインタ/クラスのインスタンスのポインタ/
0636デフォルトの名無しさん
NGNGwhile(GetMessage(&msg,NULL,0,0))
とかやってないよね
0637デフォルトの名無しさん
NGNGいけないの?
どこのサンプルでも-1をチェックしてないようだけど
0638636
NGNG確かに、大抵のサンプルはそうなってるけど、チェックした方がいいよ。
↓を見てね。
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_getmessage.asp
0639632
NGNG数年前の話だったので久しぶりにソースおこして確認してみました。
その結果、PostThreadMessageで10001個目のメッセージをPostするとエラーが返っていたことが判明。
GetMessageはエラーを返さず、GetLastErrorも0を返していたけれど
単純にメッセージキューのオーバフローが原因だと思われます。
前回はエラーチェックが甘かったのかな。
結局自前でスレッド間メッセージキューを実装してしまいました。
まぁその経験がその後の仕事で活かされた(pthread使う仕事があった)ので
自分的には結果オーライでしたが。
0640636
NGNG原因は判明したみたいだから、参考までに・・・
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_postthreadmessage.asp
0641デフォルトの名無しさん
NGNG0642デフォルトの名無しさん
NGNGかつてのSetMessageQueueSizeの説明には
ポストできるメッセージの数に上限はなくなったとか書いてたのに
なんかインチキくさいな
0643デフォルトの名無しさん
NGNG0644デフォルトの名無しさん
NGNG×SetMessageQueueSize
○SetMessageQueue
上限がなくなったとは書いてない。
必要に応じて拡張されるようになったと書いてある。
Win2Kにおける既定の拡張限界が10,000ということ。
0645デフォルトの名無しさん
NGNG普通にアプリケーション組んでれば、10000個以上のメッセージの送受信普通だが。
0646デフォルトの名無しさん
NGNG0647デフォルトの名無しさん
NGNG10,000個以上の必要には応じてくれないんですか?
やっぱ強引というかMSに好意的過ぎる解釈だと思う。
古いPostMessageのヘルプにはこんな制限書いてなかったし
0648デフォルトの名無しさん
NGNG>10,000個以上の必要には応じてくれないんですか?
ヴァカ発見(プ
0649デフォルトの名無しさん
NGNG何事にも制限はある。
どうしても、
10000個以上のメッセージを溜める糞ソフトを書きたければ、
レジストリを修正しろと書いてるだろ。
あと、この10,000という数はWin2kにおける数値だから、
Win2kが出る前の古いヘルプに書いてあるわけがないと思われ。
0650デフォルトの名無しさん
NGNGWin2000以前には制限がなかったのに
突然制限つけてドキュメントのほうまで変えるのが納得できない。
今まで95/98/NT4で動いていたプログラムが
動かなくなるってことでしょ。
0651デフォルトの名無しさん
NGNG試してみた?
手元にあったWin98マシンで試すと、
1000くらいが限度みたい。
95/NT4は手元にないので試せないけど。
0652デフォルトの名無しさん
NGNGおまえみたいなアフォがゴルァして来てウザいから追加されたんだろ。
0653デフォルトの名無しさん
NGNG強いられることをありがたがるオメデタイMS信者しか居ないようですね。
こういった変更が無いことが保証されている環境は存在しないのでしょうか。
もうこれ以上馬鹿を見るのはごめんです。
0654デフォルトの名無しさん
NGNG望んでいる変人がいるすれはここですか?
0655デフォルトは上限無しさん
NGNG>>644,649はどうみても妥当。セマンティクスは厳密になり、
しかも上限は変更可能になっている、ということで言い掛かりだと思う。
と>>653に釣られてみる。
0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNGAppleとかどうするんだろ
0658デフォルトは上限無しさん
NGNGとりあえずDarwinのソースでまあなんとか。
え? Mac OS < 9ですか? およびでない? 失礼しました〜。
0659デフォルトの名無しさん
NGNG>「ソースを使え、ルーク」なのだろうが
ワラタ
0660653
NGNGCreateThread()を使おうと思ってるのですが、作成したスレッドには一つしか引数を渡せないのでしょうか?
複数の引数を渡したいのですが・・・
0661660
NGNG0662デフォルトの名無しさん
NGNG0663デフォルトの名無しさん
NGNG>>617 >>619
バカばっか・・・
0664デフォルトの名無しさん
NGNG並列アルゴリズム ソート
でgoogleしてみよう!
つかCPU数が2以上じゃないと多分効果ないと思う
0665660
NGNGthanks
0666デフォルトの名無しさん
NGNGBeginThreadを使おうと思っているのですが、作成したスレッドには1つしか引数を渡せないのでしょうか?
複数の引数を渡したいのですが・・・
0667デフォルトの名無しさん
NGNG0668デフォルトの名無しさん
NGNGお前、ちょっとは頭使え
0669660
NGNGお前、ちょっとは頭使え
0670デフォルトの名無しさん
NGNG0671デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG大昔の話をいまさらだけど、素朴な疑問。
それらのスレッドが動き出す前に1回init_Gを呼んでおく
(そして各スレッドでは呼ばない)
ってわけにはいかないんですか?
まあそういかないから質問してたんでしょうけど。
0673デフォルトの名無しさん
NGNG・init_G()が呼ばれるかどうかは事前には判らない
・init_G()の呼び出しは少なからず何らかの常駐リソースを食う
(DLLのロードやメモリアロケート等)
という前提ならああしたくなるでしょうね。
0674デフォルトの名無しさん
NGNG0675デフォルトの名無しさん
NGNGこのPostThreadMessageしたときに渡したローカル変数bufは、自動的に解放されますか?(受け取りで何かする必要あり?)
//送信側
char buf[]="ゴルァ";
PostThreadMessage(idThread, WM_USER+10000, (WPARAM)buf, 0);
//受信側
GetMessage(&msg, NULL, 0, 0);
0676デフォルトの名無しさん
NGNGそういうう変数をPost〜で渡すのは、不確実性の元。
渡してはいけない。
0677675の上司
NGNGバカ野郎!そんなコード納品したらクビにするぞ!
二度とするなよ。いいな?
どうしてもやりたきゃ、こうしろ。
PostThreadMessage(idThread, WM_USER+10000, (WPARAM)"ゴルァ", (LPARAM)">>675の上司より");
0678デフォルトの名無しさん
NGNGタイムアウトしたのかを判断する方法知ってる人いる?
つーか、何でタイムアウト付きwait()の戻り値がvoidなの?
0679C ◆dq2PerGLN.
NGNG0680デフォルトの名無しさん
NGNG誤爆?
0681デフォルトの名無しさん
NGNG区別する方法は知らない。
> 何で
区別する必要がないから、じゃない?
0682678
NGNGあ、やっぱ出来ないのね。つーか、何で区別する必要ないの?
notify()されたかタイムアウトしたかって完全に意味違うぞ。
pthread_cond_timedwait()はタイムアウトしたらETIMEDOUT返す。
WaitForSingleObject()もWAIT_TIMEOUT返す。
普通はこんなもんだと思うんだが。
やっぱJavaって変な仕様多いな・・・(^^;
0683681
NGNG複数オブジェクトに対しor条件でwaitできれば少しはマシだったのに。
ああでも最近のJavaがどうなってるかは知らないよ。
1.4なんてぜんぜん見てない。
> 完全に意味違うぞ。
意味は違うけど、その後の処理は
*ほとんどの場合においてほとんど同じ*
という罠。
solarisのman pageのcond_timedwait()の使用例でも、抜けた後、
「やっぱり処理する必要があるかチェック」してたりする。
俺のトリアタマでは、複数のワーカースレッドが単一のリクエストキューを
待つ、という使い道しか思いつかないや。
0684名無しさん@XEmacs
NGNGpthread_cond_signal()が発行された時、
timedwait()を行った側でsignal状態の後始末をする必要があるかどうか?
ある: 返り値で区別出来てもraceは残る。→何らかの方法で解決。
ない: しかしどちらかは知る必要はある: 返り値で教えろや、(゚Д゚)ゴルァ!
どちらでもいい: (´-`).。oO(返り値何のためにあるのだろう)
最初の場合は、排他しながら調べるしかないね…
0685681
NGNG確かに普通の場合はほとんど同じことが多いかもしれない。
ちょっとWin32のEventみたいなの作ってて、wait()系のメソッドを
包んだ待機メソッド(タイムアウト付きも)実装するのに不便だな、と。
0686デフォルトの名無しさん
NGNG0687デフォルトの名無しさん
NGNGメッセージとか共有メモリを使って
代替の機能は作れると思うけど。
意味は、ないわな。
0688デフォルトは上限無しさん
NGNGセマフォは本来ソフトウェアだけで実装できるものだが、
タスク切り替えをしなければいけない/した方が効率がいい都合上、
カーネルスレッドなシステムではカーネルに実装されていること多い。
自分で実装する場合、タスク切り替えをどうするか考えないといけない。
M:Nスレッドが実装されているシステムだと、CPUを明け渡すAPIがあると思う。
Linux, *BSD, Solaris, NGPTのソースが参考になる。
UNIX System V IPCのセマフォのように、
processが死んだ時のundoを実装しているような高機能なものを作ろうとすると、
やはりカーネルの世話にならざるを得ない。
0689デフォルトの名無しさん
NGNGありが�d。
0690デフォルトの名無しさん
NGNG戻りで帰ったとおもったら直後、突然SIGKILLされてしまいます。
[pid 8618] <... accept resumed> 0x4185fa6c, [0]) = ? ERESTARTSYS (To be restarted)
[pid 8617] <... select resumed> ) = ? ERESTARTNOHAND (To be restarted)
[pid 8618] +++ killed by SIGKILL +++
+++ killed by SIGKILL +++
これの原因、何かわかりませんか・・? tcpのポートをbindしてacceptしている
だけなんですが。。
0691デフォルトは上限無しさん
NGNG> 妙な戻り
signalによるsystem callの中断って分かりますか?
/usr/include/linux/sched.hのマクロなんかでは積極的に使ってますね。
pid 8617の方は、signalによるsystem callの中断があり、
system callをrestartしようとしたら、
指定されていたfile handleがなくなっていた、というエラーです。
glibcはpopen(3)以外ではSIGKILLを出さないみたいだけど…
状況がよく分からないので、こんなところですね。
0692デフォルトの名無しさん
NGNG0693デフォルトの名無しさん
NGNGクラスの中で_beginthreadしてください
としか言えない
Javaみたいにクラスまるまるスレッド化とかは無理よ?
0694デフォルトの名無しさん
NGNGstartメソッド呼んだらrunメソッドが新しいスレッドで
走るクラスくらい簡単に作れると思うけど
0695誤爆くさいので貼ってみる
NGNG//以下では駄目なのですがどのようにすれば良いのでしょうか?
//ThreadReceptionはクラス内で定義したいのですが・・
class ThreadClass {
public:
void ThreadHead();
void ThreadReception(void*);
private:
};
void ThreadClass ::ThreadHead (){
_beginthread(ThreadReception,0,0);
return;
}
void ThreadClass ::ThreadReception(void*){
return;
}
0696誤爆くさいので貼ってみる
NGNG_beginthreadex
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNGコンパイルして確認とってないから間違ってるかもしれないけど
そのへんは適宜脳内補完してくれ
class ThreadClass {
public:
void ThreadHead();
void ThreadReception(void);
private:
static void ThreadClass::RealThreadReception(void* tc);
};
void ThreadClass ::ThreadHead (){
_beginthread(RealThreadReception,0,(void *)this);
return;
}
void ThreadClass ::ThreadReception(void){
return;
}
static void ThreadClass::RealThreadReception(void* tc){
return ((ThreadClass *)tc)->ThreadReception();
}
0699デフォルトの名無しさん
NGNG'_beginthread' : 1 番目の引数を 'void (void *)' から 'void (__cdecl *)(void *)' に変換できません
っていわれるんですが・・。
0700デフォルトの名無しさん
NGNGいわれたまんまだろ
そのぐらい自分でどうにかしろ
0701699
NGNG無事コンパイル通りました、ありがとうございました。m(__)m
0702デフォルトの名無しさん
NGNGprintfを削除すると挙動が変わってしまうのですが、
そんなときどうすればよいのでしょうか?
0703デフォルトの名無しさん
NGNG挙動が変わる原因がタイミングによるものでないなら、原因は 99% 以上君のプログラムのミスだから、ソースコードレビューを死ぬほどやりなさい。
0704デフォルトの名無しさん
NGNGような挙動なんです。
0705デフォルトの名無しさん
NGNG0706デフォルトの名無しさん
NGNG別スレッドからこのスレッドを破棄したいのですが、
可能でしょうか?
0707デフォルトの名無しさん
NGNGWin32の話ね。
WaitForSingleObjectに渡すハンドルってスレッドハンドルのことなら
TerminateThreadに渡せばスレッド終了できるけど…。
独自プロトコル作ってイベントやメッセージで通信するのがお勧めだよ。
0708デフォルトの名無しさん
NGNG>>705 じゃないけど、確かに「ハァ ?」だよ。
単に、「スレッドのプライオリティが下がるような挙動」じゃわけわからんよ。
具体的に何がどうなるのか書いてみ。
0709デフォルトの名無しさん
NGNG馬鹿ですいません 教えてくださひ
0710デフォルトの名無しさん
NGNGありが�d。
私の考え方がマズかったです。
SetEventを使用した独自プロトコルでうまくいきました。
0711デフォルトの名無しさん
NGNG***すれ立てるまでもない質問はここで 第24刷***
http://pc3.2ch.net/test/read.cgi/tech/1035354069/l50
0712デフォルトの名無しさん
NGNG辞書ぐらい買うか、ググルぐらいしたら ?
http://www.yamagata.tao.go.jp/HTML/keyword.htm
つーか、激しくスレ違いだよ。
0713デフォルトの名無しさん
NGNGサンキュ
>712
すまん
0714695
NGNG処理を同時進行でするようなプログラムを作ったんですが、途中で処理速度が著しく落ちます。
クラスにしなかった場合とした場合とを比べるとクラスにしない場合の方が10倍ぐらい早いです。
何度もデバックしてみましたが原因不明です。
エラーもでないしなにがわるいんだろうか・・・・・
0715デフォルトの名無しさん
NGNGシングルスレッドよりも遅くなるよ。
0716695
NGNG#クラス化しなくてもいい方法があるかもしれませんが・・
スレッドの数はクラス化する前も、した後も同じなので恐らく速度が落ちる事は無いと思うんですが・・
0717デフォルトの名無しさん
NGNGアンタがバグってるかのどっちかじゃろうね
0718デフォルトの名無しさん
NGNGターゲットはLinuxおよびCygwinです。
0719718
NGNGいうことになっていたので逝ってきます。
0720デフォルトの名無しさん
NGNG少し前に聞いた話だと、バグだらけで使い物にならないとか。
0721デフォルトの名無しさん
NGNGバグ取りは随時やってるようだけど、「まともに動いている」という話は
最近でも聞かないねぇ。まぁ動けばめっけもん、くらいに考えておいた
方がいいんじゃないかな。
0722デフォルトの名無しさん
NGNG自体はそんなに簡単じゃないのかな?
0723デフォルトの名無しさん
NGNG0724デフォルトは上限無しさん
NGNGそんなに簡単じゃない。
pthreadはpthread単独で意味があるわけでなく、
signal, I/Oなどなどとセットではじめて意味がある。
それぞれとの相互作用においてPOSIXに合っていなければ、
わざわざ使う意味がない。(Win32 APIでいいじゃんという意味において)
0725デフォルトの名無しさん
NGNG確かにAPI直接使えばよさげだ
0726デフォルトの名無しさん
NGNG0727デフォルトの名無しさん
NGNGただまぁ最悪自分で同期取ればいい話でもあるが。
0728デフォルトの名無しさん
NGNGなんとかなりそうだ
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNGひとつのfdに対して複数スレッドでaccept(2)して、ひどいめに遭った
0732デフォルトの名無しさん
NGNG0733デフォルトの名無しさん
NGNGっていうかスレ違いだろ
0734デフォルトの名無しさん
NGNG0735デフォルトの名無しさん
NGNGknifeなら使えます
0736デフォルトの名無しさん
NGNGマルチスレッド対応にしようとしたのだが…
void ref() {
InterlockedIncrement(&m_ref);
}
void release() {
if (InterlockedDecrement(&m_ref) == 0) {
delete this;
}
}
ところが、delete thisの直後にref()が呼ばれると、m_ref自体が解放された領域にあるため、
とんでもない値になってしまう。参照カウントをメンバー変数にするのが間違い?
どうしたらいんだろう?マルチスレッドのエキスパート様の降臨おながいします
0737デフォルトの名無しさん
NGNGdelete thisされたってことは、そのオブジェクトはもう参照されていない
と判断されたんだがら、その後にrefが呼ばれること自体がおかしい。
0738デフォルトの名無しさん
NGNG0739736
NGNG2つのスレッドが、それぞれ同時にref()とrelease()を呼び出すと…
0740デフォルトの名無しさん
NGNG0741736
NGNGEnterCriticalSection(&m_cs);
InterlockedIncrement(&m_ref);
LeaveCriticalSection(&m_cs);
}
void release() {
EnterCriticalSection(&m_cs);
if (InterlockedDecrement(&m_ref) == 0) {
delete this;
}
LeaveCriticalSection(&m_cs);
}
としても、ref()でInterlockedIncrement()にたどり着いたときには…
0742デフォルトの名無しさん
NGNGそのオブジェクトの参照カウントをageておく必要があることに
気づいてないに1000はらたいら
0743デフォルトの名無しさん
NGNGそれもなんだかおかしな動作だな。
refを発行する、というのは、どっかからobjectを貰ってきてるわけだろ。
で、releaseを発行するということは、所有権の一端を持っているわけだよな。
それで、deleteが実行されるというのは、
「refcount == 0かもしれないobjectが渡ってきた」
「release発行しすぎ」
ってなわけだろ。refするタイミングとか、考え直した方がいいんでないか?
0744736
NGNG0745デフォルトの名無しさん
NGNG0746736
NGNGあるオブジェクトのインスタンスが作られるとm_ref=1となっていて、
そのオブジェクトを例えば別のスレッドが使うためにコピーを作るとm_ref=2
となる。
まさにその瞬間に、インスタンスの元のホルダーがオブジェクトを破棄しようとすると、
m_refのインクリメントとデクリメントが同時に起きる。
Interlocked...は同時じゃないが、ref()とrelease()が同時に呼ばれrelease()を
実行しているスレッドの方が早くCriticalSectionを獲得して解放したのち、
InterlockedIncrementが呼ばれると、解放されてしまうので値が不定になってしまう。
0747デフォルトの名無しさん
NGNG「インスタンスの元のホルダーがオブジェクトを破棄」しちゃおかしいだろ。
「別スレッドに渡す」ときにコピーができるもんだろ、ふつー。
0748デフォルトは上限無しさん
NGNGDeleteされてしまうことがあるobject自身に、
objectの管理を「全て」任せようということ自体が無理。
Handler patternで行くか、refererにべたにcodeを書いてしまう。
0749デフォルトの名無しさん
NGNGmethod1() {delete str; str=0; }
method2() {func( *str );}
このメソッド2つが同時実行されるようなのとおなじ問題なわけよ。
あえて解決策を示すなら、
method1() {lock(); delete str; str = 0; unlcok(); }
method2() {lock() if( str ) func(str) unlock(); }
とかしないといけない。
0750デフォルトの名無しさん
NGNGそんなのrefcountの意味が全くないぞ。根本的にrefcountについて誤解してるだろ。
0751デフォルトの名無しさん
NGNG俺もそんな気がして来た。グローバルなオブジェクトや静的なオブジェクトを
参照カウントでやろうとしてるような気もするし。
0752736
NGNGやっぱり、そういう事になりますか。
>749
それは、ちっとも解決にならない。
method2がこの場合ref()なわけで、ref()から戻ったら、そのオブジェクト使おうと
するんだから。
>750
参照カウントは、扱われるインスタンス内に有りますが、
そのインスタンスを指すスマートポインターのようなクラスで持たなきゃならないって
事ですか?
そうでなくて、インスタンスと別にアロケートして参照カウント作ってもだめって事だけ?
>グローバルなオブジェクトや静的なオブジェクトを参照カウントでやろうとしてるような気もするし。
流石に、そんなこたぁない。
0753デフォルトの名無しさん
NGNGrefする前にreleaseが発行されてrefcount==0になる
可能性があるなら、refする前に、oobjectが生きてて、
refできるか確かめないかんやろ。その結果、objectが
死んでるなら、refしてobject渡すのは諦めなアカン。
で、そこでobjectが死んでるのが間違いなら、releaseか
refの発行の仕方がオカシイんや。
0754デフォルトの名無しさん
NGNG> >746
> やっぱり、そういう事になりますか。
ジサクジエーン?
0755デフォルトの名無しさん
NGNG> 参照カウントは、扱われるインスタンス内に有りますが、
> そのインスタンスを指すスマートポインターのようなクラスで持たなきゃならないって
> 事ですか?
> そうでなくて、インスタンスと別にアロケートして参照カウント作ってもだめって事だけ?
場所は関係ない。ただし、インスタンスとカウンタの対応を管理することを考
えれば、インスタンス内に置くか「スマートポインターのようなクラス」って
のが確実で手軽だし常套手段。
参照が増減するたびに必ずカウンタも同期しなきゃ行けないってこと、わかっ
てる? これは本来アトミックな処理なので、別スレッドに渡すってのも参照を
増やすことになるんだけど、それとカウンタの更新を別スレッドに分けちゃい
けない。
単一スレッド内でコピーする場合は複製によるカウント処理が終るより前にオ
リジナルが解放することはないので保護されるけれど、別スレッドにしてしまっ
たらその順序が保証されなくなってしまう。
0756デフォルトの名無しさん
NGNG多分 748 宛てだと思われ。
レス番号と間違えてコメント先頭のポインタを書いてしまう間違いは漏れも時々
やってしまう。
0757736
NGNG>753
>分からんヤツやな、、、
あんたほどでは(W
>refする前に、oobjectが生きてて、refできるか確かめないかんやろ。
確かめた時生きてても、じゃあ参照しようとしたら死んでる罠
確かめるときに参照かうんと増やす何て言うなよ(W
>755
>参照が増減するたびに必ずカウンタも同期しなきゃ行けないってこと、わかってる?
それは当然ですね。
>これは本来アトミックな処理なので、別スレッドに渡すってのも
別のスレッドに渡すのではなく、
あるスレッドAが参照カウントを持つOのインスタンスをつくって、
別のスレッドBがそのオブジェクトをもらおうとしたらば、
Aはもう要らないとOを破棄しようとしている最中だったわけです。
0758デフォルトの名無しさん
NGNG736 にはもう何も言わなくていいよ。
十分答え出てるのに見ようとしないんだから。
0759デフォルトの名無しさん
NGNG> 別のスレッドに渡すのではなく、
「渡す」つってんのはインスタンス自体じゃなくて参照のことをいってんだけど。
ポインタといったほうがいい?
> あるスレッドAが参照カウントを持つOのインスタンスをつくって、
> 別のスレッドBがそのオブジェクトをもらおうとしたらば、
この「もらおうとした」ってどういう状態を考えてるわけよ。
スレッドBはOのインスタンスo1に対する参照を受け取ってないわけ?
もし受け取ってるんならその時点でカウントしないとだめぽ。
0760736
NGNG>ポインタといったほうがいい?
「渡す」というのは、あるスレッドAがインスタンスOの参照(カウントが増えた状態)を、別のスレッドB
がアクセスできるようにするという意味で使いました。
そうではなくて、スレッドAの預かり知らぬところで、スレッドBがインスタンスOを
コピー(の過程で参照化運とは増える)して使おうとするということです。
参照を受け取った時には、当然参照カウントは増えていますが、Oの参照カウントを
(クリティカルセクション獲得後)増やそうとしたら、スレッドAが解放してしまっていた
わけです。
>758
そういうなら、参照カウント使ったクラスうpしてみそ。逃げますか?(W
0762デフォルトの名無しさん
NGNGもう一度だけ言うぞ。
「確かめる」と「ref()呼ぶを」、一つのLock内でやれ。
もちろん、releaseの呼び出しにも、おなじLockをかけろ。
それでも、refcountが0になるなら、releaseを呼びすぎているだけ。
0763736
NGNG0764デフォルトの名無しさん
NGNG>method1() {lock(); delete str; str = 0; unlcok(); }
が
method1() {lock(); delete this; /*this = 0;XXX*/ unlcok(); }
だから、method2()のifがそもそも出来ないという話
0765デフォルトの名無しさん
NGNG0766デフォルトの名無しさん
NGNG762のlockはそんなに広くないはずだが。
0767デフォルトの名無しさん
NGNG参照カウントが 1 のオブジェクトを複数のスレッドから参照してる時点で、
ref を呼び忘れてる。
参照回数0 のオブジェクトに到達することが正しい振る舞いだとしたら、
それは通常の参照じゃなく、弱い参照だ。
0768デフォルトの名無しさん
NGNGそもそも、スレッドが生きているかどうか分からないオブジェクトへの
ポインタを受け取ること自体に問題があるような。まさか、
スレッドA:
p = new クラス();
Bに渡す(p);
p->release();
スレッドB:
p = Aから受け取る();
p->ref();
というコードを書いていないだろうな?もしそうなら構造上の問題。
Bから見える場所にpを格納したなら、その分の参照カウントを数えなくては
ならない。それって本質的にはシングルスレッドでも同じことだけど。
0769デフォルトの名無しさん
NGNGCOM知ってさえいれば・・・
0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG普通Aがそれを知る必要は無いと思うが?
単にBが自分でディクリメントすればいいだけで。
0772デフォルトの名無しさん
NGNG>>745 >>769に同意。
リファレンスカウントのサンプルを見たければCOMを勉強すればよい。
それと。日本語で一所懸命書かれてもどうにも伝わりにくいようですな。
C言語で(擬似コードでも可)書いた方が意図が伝わると思いますが。
0773デフォルトの名無しさん
NGNG> 参照を受け取った時には、当然参照カウントは増えていますが、Oの参照カウントを
> (クリティカルセクション獲得後)増やそうとしたら、スレッドAが解放してしまっていた
> わけです。
そりゃカウントミスってる。AがOを持ってるところでBがOの参照を受け取って
カウントも増やしたんなら、カウントは2以上のはずだ。その状態でAが解放し
てしまうというのはバグ。
0774デフォルトは上限無しさん
NGNGReference Counting - Part III (Multithreading!)
http://www.gotw.ca/gotw/045.htm
Reference Counting - Part I
http://www.gotw.ca/gotw/043.htm
Reference Counting - Part II
http://www.gotw.ca/gotw/044.htm
0775デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNG0779デフォルトの名無しさん
NGNG親スレッドから子スレッド(以後スレ)を10本同時進行で走らせていて、すべての処理が終った時
子スレの呼び出しの前に変数でフラグを立てておき、そのスレの最後でフラグをONにし、
親スレでそれを確認してからスレを終わるように処理を書いているのですが、
親スレで子スレのフラグを確認している最中に子スレが書き込みすると処理が停止してしまいます。
(デバックしてみるとその付近で停止したりしなかったりする)
このスレのどこかで参照は同時に行ってもかまわないようなレスをみたのですが(記憶が確かなら…)
同時書きこみでない場合(書き込み中を参照)でもだめなのでしょうか?
クリティカルセッション等やらねばダメなのでしょうか?
それともこのような設計が悪いのでしょうか・・
0780779
NGNG>マルチスレッドプログラミングは、やればやるほど
>スレッドを減らす方向に設計したくなるという面白い側面がありますね
私もスレッドにはうんざりですw
まぁ設計が悪いんでしょうが・・・
0781デフォルトの名無しさん
NGNGDQNは使うな
つーか、一冊でも参考書読め
0782779
NGNG長文書いたにもかかわらずすいません・・
後余談ですが、デバック中に子スレッドでconnect、closesocketを何度かやっていると
ある一定回数(かなりの回数)を超えた時、connectが出来ない状態になりました。
何らかのエラーが発生した場合そのエラーを表示するようにプログラムを
書いているのですが全く表示されません。
Socketの処理は居たってシンプルなもので、スレッドとは別で行っているのでバグは無いと思うのですが・・。
このような事は通常起こり得るのでしょうか?
0783736
NGNG0784デフォルトの名無しさん
NGNG>766
参照カウントを持つオブジェクトのリストがあって、追加・削除、参照(+そのための検索)
を行おうとすると、それぞれでリスト全部ロックしないと…
まあ、注目してるノードとその前後だけロックというのも有りうるけど面倒すぎる。
リスト自体が要素すうもってるし。
>767
参照できるようにする過程での話です。
参照カウントインクリメント不足は、お腹一杯。
>768
スレッドBのAから受け取る()は、どういう処理?
そのなかで、当然Mutexとかで排他制御して参照カウント増やすんでしょ?
その瞬間の話。
>769
実はCOMです。
COMのモジュール内で持ってる情報の管理でつまずいてる。
769はSTAだけつかってなさい。
0785デフォルトの名無しさん
NGNGちみもSTAだけつかってなさい。
> C言語で(擬似コードでも可)書いた方が意図が伝わると思いますが。
そいでは、>774の
Reference Counting - Part III (Multithreading!) http://www.gotw.ca/gotw/045.htm から
String::~String() {
bool bDelete = false;
data_->cs.Lock(); //---------------------------
if( data_->refs == Unshareable || --data_->refs < 1 )
bDelete = true;
data_->cs.Unlock(); //-------------------------
if( bDelete)
delete data_;
}
String::String( const String& other ) {
bool bSharedIt = false;
other.data_->cs.Lock(); //---------------------
if( other.data_->refs != Unshareable ) {
bSharedIt = true;
data_ = other.data_;
++data_->refs;
}
other.data_->cs.Unlock(); //-------------------
if( !bSharedIt )
data_ = new StringBuf( *other.data_ );
}
(つづく)
0786736=784=785
NGNGThread A Thread B
delete O1呼び出し O2 = O1 (otherがO1)
data_->cs.Lock(); other.data_->cs.Lock()
if (--data_->refs < 1)
bDelete = true;
data_->cs.Unlock();
if (bDelete) data = other.data;
delte data; ++data_->refs;
other.data_cs.Unlock()
例のコードではStringなので、ロック後解放済みだったら空の文字列
を返せばよいのですが、実際には目的のデータであることを確認後
Thread BはO1のコピーのO2を手に入れようとしているので困ってます。
目的のデータがあるかどうかの検索の最初から、コピーを手に入れるまで
と解放処理を呼び出すのもまるっきり排他制御すればできるのは明らかで
すが、極端にパフォーマンスが落ちてしまいます。
0787736
NGNG> そりゃカウントミスってる。AがOを持ってるところでBがOの参照を受け取って
> カウントも増やしたんなら、カウントは2以上のはずだ。その状態でAが解放し
> てしまうというのはバグ。
はぁー。
受け取る処理ってどうやるのさ?
>774
これからよく読んでみます。
ありがと。
0788デフォルトの名無しさん
NGNG> Thread A Thread B
ここでBは既にO1への参照を持ってんだろ?
> delete O1呼び出し O2 = O1 (otherがO1)
0789736
NGNGO2=O1は、そのリストから目的の物を検索して取り出す処理の中。
0790デフォルトの名無しさん
NGNG素朴リファレンスカウントGCをやるなら、
すさまじい細粒度ロックで効率が低下するのは
覚悟しなきゃ。
(普通のGCを使ったほうがずっと速いよ。)
0791デフォルトの名無しさん
NGNGやっぱりおかしいな。リストがStringを持ってるわけだろ?
それで、Thread Aがリストから要素を削除したら~String()が呼ばれる
わけだが、その前にThread Bがリストの要素への参照を持ってるなら
参照カウントは2になってなきゃおかしい。
こういうことするなら、当然文字列を指す可能性のあるオブジェクト
全部にリファレンスカウント付けて管理してるんだろ?
0792デフォルトの名無しさん
NGNGGarbageCollectedというスマートポインタを作って、
ヒープのオブジェクト全部GarbageCollectedを継承するように
するんだな。
そして、リストの検索とかやるときは、1つ1つの要素を
ロック・ref++・アンロック、ロック・ref--・アンロックすると。
0793デフォルトの名無しさん
NGNGもしかして
「排他制御せずにリストにアクセスしたら、変になるんですけど。」
って言ってる?
スレッドAがリスト中のO1を削除するには、
list.remove(index)
あるいは
list.remove(O1)
スレッドBがO1のコピーを作るには、
O2 = list.get(index)
だよな?
で、この get と remove はロックを使わずやりたいと。
そういうことか?
0794736
NGNG>その前にThread Bがリストの要素への参照を持ってるなら
>参照カウントは2になってなきゃおかしい。
リストの要素への参照とは?
O1がそれだと言っているのか(W
>793
>で、この get と remove はロックを使わずやりたいと。
>そういうことか?
そう。
でも、
>「排他制御せずにリストにアクセスしたら、変になるんですけど。」
という事じゃない。
removeで要素中のO1は削除されるけど、Thread BがO2を手に入れていれば
O1-+
+-->ref:2,data:"ABC"
O2-+
から
O2---->ref:1,data:"ABC"
となり、他のスレッドは、もはやこのデータにアクセスできないが、
Thread BはO2から使える。O2が不要になって破棄したら、データ本体も解放される。
0795デフォルトの名無しさん
NGNGそいつらが平行したらあぼーんちゃうの。
まあ、「いや、実は〜」とかいって
新状況が出てくるのかも知らんけど(ワラ
0796デフォルトの名無しさん
NGNG> 参照が増減するたびに必ずカウンタも同期しなきゃ行けないってこと、わかっ
> てる? これは本来アトミックな処理なので、
と書いてある意味分かんないのか?
>>789
> O2=O1は、そのリストから目的の物を検索して取り出す処理の中。
てんなら、その処理中での参照の追加とカウントの増加は原理的に(そのオブ
ジェクトに対する)排他処理は必須ってことなんだが。
0797デフォルトの名無しさん
NGNGアトミックに行われないとまずいね。
getが返すべきO1を得た後で、かつO1のrefが増える前にrefがゼロに
なっちゃう。
やはり、
・リスト全体にmultiple-readers-single-writer lockをかける。
・リストの要素1つ1つに排他的ロックをかける。
のどちらかが必須。
0798デフォルトの名無しさん
NGNGgetの中で「注目してるオブジェクト」を示すポインタが
あれば、そいつの参照も数えるべき。
あるオブジェクトを指す変数がある瞬間に3つあるなら
(たとえば「リストから」「Thread Aの局所変数から」
「Thread Bの局所変数から」)、参照カウントはその瞬間
3でないと間違い。
0799デフォルトの名無しさん
NGNG>実はCOMです。
>COMのモジュール内で持ってる情報の管理でつまずいてる。
COM扱っててこの有様は信じられない。
0800736
NGNG未だに問題のポイントがわかってない言語障害者が居ますね。
>797
やっぱり、そうなっちゃいますかね。
>799
COMは関係なかろう、STAならInterlock何かする必要無いし、
そうでなければ、COMでも同じ。
0801デフォルトの名無しさん
NGNG逃れられる。
でも、2人が同時にリストにあぷデートに行ったらどうやっても
ロック必須だけどナー
0802デフォルトの名無しさん
NGNG0803デフォルトの名無しさん
NGNGできるようなの誰か知らんか?
0804デフォルトの名無しさん
NGNG考え方おかしいよ。
管理する側とされる側がごっちゃになってる。
そもそもdelete後に破棄されたインスタンスの排他制御
オブジェクトを参照しようとしてる事をおかしいと思わないの?
0805デフォルトの名無しさん
NGNGスレッド間で、GC(インクリメンタルなマーク&スイープ)で管理された
共有領域のメモリオブジェクトを使いたいんですが、メモリオブジェクト
にはアクセスする度に排他制御しないといけませんよね?
参照するだけなら不要なのはわかるんですが、ポインタを繋ぎ変えたりも
したいので、結局双方でロックしてないと駄目ですよね。
素直に組むと、メモリオブジェクトの粒度が小さいので排他制御にかなり
の時間が割かれてしまいそうなんですが、良い方法はないでしょうか。
素人考えで思いついたのは、スレッド毎にローカルなメモリオブジェクト
領域を使って、処理が完了したら、その結果を共有メモリオブジェクト
領域に移すという方法で、排他制御は共有メモリにアクセスするとき
のみ掛けるというものですが、この方法だとスレッド毎にGCが必要な気が
します。
もっと一般的な方法があったらお願いします。
0806デフォルトの名無しさん
NGNG読むだけなら排他制御は不要だよ。
整数や文字を書き込むときも(共有変数以外は)不要。
ポインタを書いたときはライトバリアでGCに通知。
これも別に排他制御はいらない。たとえばスレッドごとにキューを作って、
ページ単位とかでまとめて渡せばよい。
0807805
NGNGありがとうございます。
ライトバリアでマークする経路を保証するって事ですよね。
共有領域とローカルの区別をする手段が思いつかない(複数
ブロックにまたがってる)んで、改竄個所を全部保護する様に
書き直さないとまずいのかな。
ちょっと考えてみます。
0808デフォルトの名無しさん
NGNGtemplate Pointer<class T> ...
みたいなオブジェクトにして、コピーコンストラクタ
でライトバリアをかければよいんじゃないだろうか。
0809736
NGNG頭おかしいよ。
こんなのどこにでもある。見たこと無いのか?
0810デフォルトの名無しさん
NGNG何人もの人間が否定してるんだから、おかしいのはお前だろ(笑
0811736
NGNG0812デフォルトの名無しさん
NGNG「どこにでもある」 が 「おかしくない」 の理由には全然ならない事に気付け。
つーか、そんなのそうそう転がってないはずなんだが、あんたよっぽどクソな
サンプルに見舞われてるんだな。
>>811
おかしいのは COM を把握してないのにわかったつもりになってるあんたの頭。
つーか、教えを乞う立場だったら、もっと謙虚になれ。
主観を捨てろ。
答えへのポインタはもう不必要なほど出ているのに、あんたはそれを全部捨てている。
0813736
NGNG>つーか、教えを乞う立場だったら、もっと謙虚になれ。
共有しているオブジェクトの集合に丸ごとロックかけずに、
各オブジェクトの参照カウントだけで済むかがポイントなのに、
参照カウントのインクリメント不足だとか、
COMを知ってればとか、
おんなじ事 おんなじ事 おんなじ事 おんなじ事 ばかーーーり。
しつこつ しつこく しつこーーーーく 同じこと繰り返す粘着が多くてウンザリ。
getはアトミックだとか…あのなあ、それ自体はアトミックでもremoveとgetを同時に呼ぶことは出来るんだよ。
参照を持っているならとか…あのなあ、その参照を受け取るのがgetだろ。共有オブジェクトのgetなんだよヴォケ。
じゃあ、参照を手に入れる処理を書いてみろというと、とたんに逃げ出す。
どうしてポイントがずれた香ばしい奴が多いのか。
0814736
NGNG>「どこにでもある」 が 「おかしくない」 の理由には全然ならない事に気付け。
>つーか、そんなのそうそう転がってないはずなんだが、あんたよっぽどクソな
>サンプルに見舞われてるんだな。
これ見たこと無いか?
static ULONG WINAPI Increment(LPLONG p) {return InterlockedIncrement(p);}
static ULONG WINAPI Decrement(LPLONG p) {return InterlockedDecrement(p);}
ULONG InternalAddRef() {
return _ThreadModel::Increment(&m_dwRef);
}
ULONG InternalRelease() {
return _ThreadModel::Decrement(&m_dwRef);
}
STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
STDMETHOD_(ULONG, Release)() {
ULONG l = InternalRelease();
if (l == 0)
delete this;
return l;
}
まあ、君のコードの中では、
static ULONG WINAPI Increment(LPLONG p) {return ++(*p);}
static ULONG WINAPI Decrement(LPLONG p) {return --(*p);}
しか使われないと思うが(W
0815デフォルトの名無しさん
NGNG1.listでCOM objectを束ねているらしい
2.list内のあるCOM objectに対して、
releaseとrefが(release->refの順で)発生して死ぬようだ
3.list全体に対するlockはかけたくないらしい
(listが持つCOM objectに対する個々のロックは可能みたい?)
736の発言だけで、この問題がわかるかってーの。
それを736の時点で言えば、まだ混乱は少なかっただろうに。
変に情報を出し惜しむから、おなじ事をしつこく何度も
言われる羽目になる。おまけに自分のことを棚に上げて
しつこいとか、ポイントがずれてるとか、香ばしいとか言うし。
0816736
NGNG0817デフォルトの名無しさん
NGNGというか、コードだせ、コード。問題の起こる、
必要最小限の、736の書いたコードを。
0818736
NGNG参照カウントを0から始めたに100スレッド
740 :デフォルトの名無しさん :02/11/12 21:24
ref() と release() が互いに排他してなきゃ動くわけないじゃん。
742 :デフォルトの名無しさん :02/11/12 21:57
あるオブジェクトに触れるスレッドが一つふえたら
そのオブジェクトの参照カウントをageておく必要があることに
気づいてないに1000はらたいら
743 :デフォルトの名無しさん :02/11/12 21:58
>739
それもなんだかおかしな動作だな。
refを発行する、というのは、どっかからobjectを貰ってきてるわけだろ。
で、releaseを発行するということは、所有権の一端を持っているわけだよな。
それで、deleteが実行されるというのは、
「refcount == 0かもしれないobjectが渡ってきた」
「release発行しすぎ」
ってなわけだろ。refするタイミングとか、考え直した方がいいんでないか?
745 :デフォルトの名無しさん :02/11/12 22:52
736はひょっとしてCOMを知らない?
747 :デフォルトの名無しさん :02/11/13 10:35
「別のスレッドが使うためにコピーを作る」ときに
「インスタンスの元のホルダーがオブジェクトを破棄」しちゃおかしいだろ。
「別スレッドに渡す」ときにコピーができるもんだろ、ふつー。
0819736
NGNGひょっとしてrefcountをさらにポインタや参照で管理しようとしてないか?
そんなのrefcountの意味が全くないぞ。根本的にrefcountについて誤解してるだろ。
751 :デフォルトの名無しさん :02/11/13 11:28
>>750
俺もそんな気がして来た。グローバルなオブジェクトや静的なオブジェクトを
参照カウントでやろうとしてるような気もするし。
753 :デフォルトの名無しさん :02/11/13 15:40
分からんヤツやな、、、
refする前にreleaseが発行されてrefcount==0になる
可能性があるなら、refする前に、oobjectが生きてて、
refできるか確かめないかんやろ。その結果、objectが
死んでるなら、refしてobject渡すのは諦めなアカン。
で、そこでobjectが死んでるのが間違いなら、releaseか
refの発行の仕方がオカシイんや。
0820736
NGNG>>736
参照カウントが 1 のオブジェクトを複数のスレッドから参照してる時点で、
ref を呼び忘れてる。
参照回数0 のオブジェクトに到達することが正しい振る舞いだとしたら、
それは通常の参照じゃなく、弱い参照だ。
769 :デフォルトの名無しさん :02/11/13 23:23
> あるスレッドAが参照カウントを持つOのインスタンスをつくって、
COM知ってさえいれば・・・
772 :デフォルトの名無しさん :02/11/13 23:58
なんか皆さん盛り上がってますが…
>>745 >>769に同意。
リファレンスカウントのサンプルを見たければCOMを勉強すればよい。
それと。日本語で一所懸命書かれてもどうにも伝わりにくいようですな。
C言語で(擬似コードでも可)書いた方が意図が伝わると思いますが。
773 :デフォルトの名無しさん :02/11/14 00:03
>>760
> 参照を受け取った時には、当然参照カウントは増えていますが、Oの参照カウントを
> (クリティカルセクション獲得後)増やそうとしたら、スレッドAが解放してしまっていた
> わけです。
そりゃカウントミスってる。AがOを持ってるところでBがOの参照を受け取って
カウントも増やしたんなら、カウントは2以上のはずだ。その状態でAが解放し
てしまうというのはバグ。
0821デフォルトの名無しさん
NGNG(いや、元々そうだったという説もあるが・・・)
という訳で出て逝ってくれ。
0822736
NGNG0823デフォルトの名無しさん
NGNG0824736
NGNG0825デフォルトの名無しさん
NGNGあのさあ、
しつこいのは お ま え (w
消えろ
0826デフォルトの名無しさん
NGNG> 共有しているオブジェクトの集合に丸ごとロックかけずに、
> 各オブジェクトの参照カウントだけで済むかがポイントなのに、
参照カウントのインクリメントにはロックは*原理的に*必要不可欠。
してないのはシングルスレッドを前提にしてる場合だけ。
わかった?
> 参照カウントのインクリメント不足だとか、
> COMを知ってればとか、
> おんなじ事 おんなじ事 おんなじ事 おんなじ事 ばかーーーり。
> しつこつ しつこく しつこーーーーく 同じこと繰り返す粘着が多くてウンザリ。
なんでおんなじ事をこんなにしつこく説明してやらなきゃならんのか…。
> getはアトミックだとか…あのなあ、それ自体はアトミックでもremoveとgetを同時に呼ぶことは出来るんだよ。
> 参照を持っているならとか…あのなあ、その参照を受け取るのがgetだろ。共有オブジェクトのgetなんだよヴォケ。
そのアトミックなgetにカウントのインクリメントを含めてないからバグって
んだろが。
0827736
NGNG>参照カウントのインクリメントにはロックは*原理的に*必要不可欠。
>してないのはシングルスレッドを前提にしてる場合だけ。
>わかった?
void ref() {
EnterCriticalSection(&m_mutex);
InterlockedIncrement(&m_ref);
LeaveCriticalSection(&m_mutex);
}
void release() {
EnterCriticalSection(&m_mutex);
if (InterlockedDecrement(&m_ref) == 0) {
delete this;
}
LeaveCriticalSection(&m_mutex);
}
としたら満足か?(W
0828736
NGNGおまえ、InterlockXXってなんのためにあるのか知らんだろ。
知らない奴に限って、無駄なレスを返しやがる。
0829デフォルトの名無しさん
NGNG一体何の為にここに質問に来たんだ?
0830デフォルトの名無しさん
NGNG>>837
>EnterCriticalSection(&m_mutex);
> InterlockedIncrement(&m_ref);
>LeaveCriticalSection(&m_mutex);
クリティカルセクション張ってるんだから、
インターロック不要なんだけど。
>EnterCriticalSection(&m_mutex);
> if (InterlockedDecrement(&m_ref) == 0) {
> delete this;
> }
>LeaveCriticalSection(&m_mutex);
自分で書いてておかしいと思わないのかなあ・・
0831736
NGNGあのなあ、
>>参照カウントのインクリメントにはロックは*原理的に*必要不可欠。
>>してないのはシングルスレッドを前提にしてる場合だけ。
>>わかった?
というのは読めないのか。お前は、自然言語にたいする理解力は0だな。
ロックかけなきゃだめだと言ってるやつがいるから、ロックしたまで。
なーんの解決にもならんし、もともと、Interlockしてるから不要なんだがな。
0832736
NGNGだわ
0833736
NGNGどうせ、別人のフリしてまた別の事言い出すんだろうが
0834736
NGNGまあ、どのみちref()でロック獲得したときに、解放済みというのは避けられんが。
0835デフォルトの名無しさん
NGNG> としたら満足か?(W
で、バグは直ったのか? 漏れが満足したからってバグが消えるわけじゃないぞ。
void Item::ref() {
InterlockedIncrement(&m_ref);
}
Item* List::get() {
EnterCriticalSection(&m_mutex);
Item* p = ...;
p->ref();
LeaveCriticalSection(&m_mutex);
return p;
}
この例で行くとListのget()とremove()で競合が起きるんだろ?
ならListのほうで排他処理をするのが自明の理。
0836736
NGNG0837デフォルトの名無しさん
NGNG0838736
NGNGここのいる連中じゃ無理のようだ(W
0839736
NGNG>「どこにでもある」 が 「おかしくない」 の理由には全然ならない事に気付け。
>つーか、そんなのそうそう転がってないはずなんだが、あんたよっぽどクソな
>サンプルに見舞われてるんだな。
812も逃げたようだな。逃げ足の速い連中だ。
0840デフォルトの名無しさん
NGNG> それ以外に無いのか聞いてんだが。
散々いわれてんのに。>>762とか>>785とか。
大体間接的に渡すって話自体>>789くらいでいきなりだし。
>>839
> 812も逃げたようだな。逃げ足の速い連中だ。
いつまでも君の相手してらんないしね。
漏れもそろそろ出かけなきゃならないんでバイバイ。
0841デフォルトの名無しさん
NGNG関数はunixにありますか?
0842デフォルトの名無しさん
NGNG終了するわけじゃないけど。
0843デフォルトの名無しさん
NGNGpthread_cancel()を実行すると
実行されたスレッドの終了はいつになるのですか?
0844デフォルトの名無しさん
NGNG0845736
NGNGまたバカが湧いてきた。
>散々いわれてんのに。>>762とか>>785とか。
>762は、各オブジェクト毎にロック掛けるって意味ならロックが多量に必要だし、リストにはロック掛けないのか?
リストにロックかけるんだったら、各オブジェクト毎に掛ける必要なし。
君のような厨には理解で菌だろうがな。
>大体間接的に渡すって話自体>>789くらいでいきなりだし。
間接的?ハァ?頭大丈夫?
785は俺だ。
たくっ。ろくに読まないでレスするアホウは書くなっつの。
>いつまでも君の相手してらんないしね。
>漏れもそろそろ出かけなきゃならないんでバイバイ。
いや、君みたいなアホウに相手してくれとは言ってないから(W
お呼びでないの(Wつか出てくんなっての
大体、レスして何か言われたら自分が誰かわかるように名前に番号入れるもんだろ。
言いっぱなしで自己満足してる厨が多すぎ。
0846736
NGNGref() と release() が互いに排他してなきゃ動くわけないじゃん。
826 :デフォルトの名無しさん :02/11/15 13:03
>>813
> 共有しているオブジェクトの集合に丸ごとロックかけずに、
> 各オブジェクトの参照カウントだけで済むかがポイントなのに、
参照カウントのインクリメントにはロックは*原理的に*必要不可欠。
してないのはシングルスレッドを前提にしてる場合だけ。
わかった?
こういう連中は、
void ref() {
EnterCriticalSection(&m_cs);
++m_ref;
LeaveCriticalSection(&m_cs);
}
void release() {
EnterCriticalSection(&m_cs);
if (--m_ref) == 0) {
delete this;
}
LeaveCriticalSection(&m_cs);
}
って書いてるのかな。馬鹿だなー。
こんな事言ってる奴が多いのは オ ド ロ キ。
もはや都市伝説だな。
0847736
NGNG830が、慌ててネットで調べ始めた。まあ、自分の馬鹿さ加減を思い知れ。
0848736
NGNG他にもInterlockだけじゃダメだと思ってる奴も多いな。
まあ、release()のLeaveCriticalSectionがdelete以降なのは論外だが、
void ref() {
InterlockedIncrement(&m_ref);
}
void release() {
if (InterlockedDecrement(&m_ref) == 0) {
delete this;
}
}
じゃだめだと思ってるやつは何か言ってみろ。
どうせ逃げんだろうけどな。
0849デフォルトの名無しさん
NGNGInterlockedIncrement(&m_ref); // A
}
void release() {
if (InterlockedDecrement(&m_ref) == 0) {
// B
delete this;
}
}
B のタイミングで A が呼ばれた場合。
0850デフォルトの名無しさん
NGNGInterlockedIncrement(&m_ref); // A
}
void release() {
if (InterlockedDecrement(&m_ref) == 0) {
delete this;
// C
}
}
C のタイミングで A が呼ばれた場合。
しかし、危険性において 846 のコードは結局 848 と変わらないな。
0851736
NGNG0852736
NGNG説明してみろよ。わくわく。
Bのところに行くのは、どういう場合さ?
0853デフォルトの名無しさん
NGNG馬鹿です。
0854デフォルトの名無しさん
NGNG0855デフォルトの名無しさん
NGNG>リストにロックかけるんだったら、各オブジェクト毎に掛ける必要なし。
>君のような厨には理解で菌だろうがな。
つか、762の時点では、そもそもリストが使われていることが
説明されていないわけで、762の時点で「リストにもロックかけろよ」
と言えるなら、そいつは神
0856736
NGNG0857736
NGNGリストである必要なし。
グローバル変数など共有してれば同じ。
この場合動的じゃなきゃ意味無いが。
0858デフォルトの名無しさん
NGNG0859デフォルトの名無しさん
NGNGようにはできないのか?
bool m_sw1st; // コンストラクタで true に
bool ref() {
bool ret = true;
EnterCriticalSection(&m_cs);
if(!m_ref)
{
if(m_sw1st)
m_sw1st = false;
else
ret = false;
}
if(ret)
++m_ref;
LeaveCriticalSection(&m_cs);
return ret;
}
void release() {
EnterCriticalSection(&m_cs);
if (--m_ref) == 0) {
delete this;
}
LeaveCriticalSection(&m_cs);
}
参照カウンタが 1 始まりなら m_sw1st は要らないけど。
0860859
NGNG0861736
NGNGref()のEnterCriticalSectionでブロックされてるときに
deleteされるのは大丈夫か?
首尾よく、ref()でCriticalSectionに入れてもm_refは不定だぞ。
0862736
NGNG0863デフォルトの名無しさん
NGNG0864デフォルトの名無しさん
NGNGだから、無いんだって。intのlistを考えてみろよ。
lockしないで、検索処理と、削除処理を併走できるかっつーの。
0865デフォルトの名無しさん
NGNGリストなら丸ごとロックしなくてもできる。
0866736
NGNGと言うと?
>864
おい!あるってぞ。言い返せよ。
0867デフォルトの名無しさん
NGNG自身の不明を恥じて、詳細を拝聴するだけサ。
0868865
NGNG見ているなら同時に動いて問題ない。検索処理が、ちょうど3番目の要素を見ようとしているか
3番目から4番目に移ろうとしている時だけが同時に動けないだけ。
どのみち、要素数とか持っているリストだと同時に複数が書き込めないから、
たかだか一つの要素だけ排他制御できさえすればよい。
0869デフォルトの名無しさん
NGNGどっちが速いんだろうか。
そういうものの定石を適用すると、リストを示すポインタ値を適当にハッシュして16個くらいの
ロックに分散させる、てな感じにするんだと思うよ。一要素毎にロックを持つのはリソースを食
うし、あまりぶつからない程度に分散させれば十分だから。
0871デフォルトの名無しさん
NGNG865が言っているのは、要素毎にロック作らなくても、
同時書き込み無しなら、一つロックがあればいいということだろ。
丸ごとロックしなくても、ロック一つでWriterはReaderと共存(Readerがいなく
なるまでまたなくても)できると。
0872デフォルトの名無しさん
NGNGロックが一つしかないなら、どうやって、
「今削除しようしている所を読んでるreaderがいない&
readerは削除しようとしている所へ進入しない」って
保証できるん?
0873736
NGNG各スレッドが別の要素にアクセスするとして。
リストが要素数なんか持ってても大丈夫?
単純なリストならまだしも、空リストとか管理されてると結局その中の
一つのスレッドしか書き込みできない(というか排他制御が必要な)気がするが。
0874871
NGNGwriterは要素の変更じゃ無くて、要素の追加・削除を行うとして。
writerが削除しようとしている要素とかその次の要素の場所を書いとけば、
readerはそれみて何とかできる気がするが。
writerが削除しようとしている要素はすっ飛ばすとか。
追加は先頭でも最後でも問題起きないと思うが。
どっちにしろ、readerはwriterがする事を知っているのが前提で、
汎用ではなく。
0875872
NGNG配列と、その配列全体に対するロックがあれば解決できる話
なのか?
0876デフォルトの名無しさん
NGNGそれだと、「削除されるべき場所にいるreader」が、
「『リストの次の要素へ』を発行すること」をどう保証するか、
writerはどう検出するかって問題になるとおもうけど、、
0877デフォルトの名無しさん
NGNGドキュソPGのスレはここですか?
0878デフォルトの名無しさん
NGNG( ´д)ヒソ(´д`)ヒソ(д` )
0879デフォルトの名無しさん
NGNGなんつって
0880768だけどさあ
NGNGリストの排他制御と、参照カウントの問題と、参照カウントの
排他が全部ごっちゃになっている時点でもう駄目。
まず、リストに複数スレッドからアクセスするなら、そのリストの
どこかに排他入れなきゃ駄目なの。次に、問題の共有オブジェクト
はリストからの参照の分があるから、リストに繋がっている間は
参照カウントは常に1以上でなきゃ駄目なの。「見付けた」時点では
「リストの方が」排他されているから、この間に参照カウントを増やそうね。
リストの排他が終わった時点で、参照カウントは2以上だから、この後
リストからremoveされても平気だよね。(ここが768の「Bから見える場所に
云々」ということの意味。)第三に、参照カウントも複数のスレッドから
参照されるから、これも排他しなくちゃならないよね。これはさすがに
分かってるみたいだけど。
0881736
NGNG0882デフォルトの名無しさん
NGNG0883870
NGNG何への質問だかわからないけど、16っていうマジックナンバーがあるから
870 だと仮定して答える。
「リストから remove 」等の処理に排他制御をかけるとして、ごく素朴な
リスト全体にたいしてロックが1つ、という状態では競合が起きた場合に
素直にパフォーマンスが悪化する。並列性が高くなればなるほど競合の可
能性は増し、結局並列動作できない場面が出てくる。
その辺をチューニングする場合の定石として、適当にロックの数を増やす
ってのがある。コンテキストスイッチングに比べて排他の対象となる操作
の方が十分重い場合には、寝てるスレッドのことはほぼ無視しても良いの
で、CPU の数+αに分散させれば十分。そうじゃないときは多めにする。
0884870
NGNGそのタイミングで当該オブジェクトへのアクセスが発生するって思うのは、
参照カウントというものが何であるのかをわかっていないと思う。
そらまあそーいうこともあるだろうケド、その場合呼び出し側がバグって
るわけで。
0886736
NGNG帰って寝てろ
ワラワラ
0887736
NGNG>880
> 第三に、参照カウントも複数のスレッドから
> 参照されるから、これも排他しなくちゃならないよね。
どういう風に?(W
0888736
NGNGおまえも881だろ。
>884=870
もうちょっと、説明してくれや。
0889736
NGNG>880
教科書のコピペはやめようね
0890元祖736
NGNG0891736本人
NGNG0892元祖736
NGNGだぁから、そんなのあたりまえだろ。おまえはしらなかったかもしらんが。
そこを参照カウントに技使って、リストのロックに工夫できないかという話だったのが、
しつこく しつこく しつこーーく 参照カウントのインクリメント不足だと
おんなじ事繰り返す厨の集団攻撃が始まっちまったんだよ。
しまいには、ref()とrelease()に排他制御が無いからだと言い出すドアホまで
何人も出てきやがるし。お前達は、お呼びじゃないんだよ。
0893870
NGNG数えておいて、ゼロになったら誰も見てないから開放〜てなアイデア。
だからカウントがゼロになった後は誰から参照されておらず、どんな
メソッド…メンバ関数も呼ばれないわけです。呼んだとしたらそれは
呼び出し側のバグ。
0894デフォルトの名無しさん
NGNG736ではそんな話には読めない。最初からそう書けよ。
>おんなじ事繰り返す厨の集団攻撃が始まっちまったんだよ。
自業自得
0895デフォルトの名無しさん
NGNGどんどん話が変わっているような。しかも参照カウントとオブジェクトを
参照しているリストなんて、参照カウントを増やすこと以外に全然関係
無いから、工夫なんてまず無理だろう。
0896デフォルトの名無しさん
NGNG0897デフォルトの名無しさん
NGNG違いますよ。
0898デフォルトの名無しさん
NGNG0899736
NGNGギブアップしたの?(W
0900デフォルトの名無しさん
NGNG参照カウントなんて使わずにまともなGC使えや。
0901デフォルトの名無しさん
NGNG自信ないけど…。
スレッド 1 がクリティカルセクションに入って参照カウントを 0 にしようとした
瞬間、別のスレッド 2 がカウントアップしようとクリティカルセクションで
ブロックに突入するからまずいんだろうな。同期ブロックに入っている数もカウント
しておいて、参照カウントと同期ブロックスレッド数が 0 になったところで初めて
開放すれば良いんじゃなかろうか。
…でも別スレッドからカウントアップ可能ということはそのスレッドから参照が残っ
てるってことだからやっぱり無理なのか? CPU 負荷などの影響でカウントアップ側の
処理が遅れたらアウトだもんな。んでもスレッド間での参照の「コピー」時にしっかり
カウントアップしてれば問題無いような。
参照カウントと循環参照について IBM に話が載ってるけどこれはガイシュツかいな。
http://www-6.ibm.com/jp/developerworks/java/000721/j_garbage-collection.html
0902デフォルトの名無しさん
NGNGつまり、ref や release に到達する時点でそのオブジェクトに対する排他制御が
かかってなきゃいけない。それらのメソッドに入ってからでは遅い。
Object* List::get(int index){
criticalSections_[index % 4].enter();
Object* o = items_[index];
if(o != NULL){
o->ref();
}
criticalSections_[index % 4].leave();
return o;
}
void List::remove(index){
criticalSections_[index % 4].enter();
Object* o = items_[index];
if(o != NULL){
o->release();
items_[index] = NULL;
}
criticalSections_[index % 4].leave();
return o;
}
こんな感じか?
0903デフォルトの名無しさん
NGNG0904入門者だけど
NGNG共有されていれば、その参照自体にも排他をかけなければならない
というだけの話だ、という理解で合ってる?
0905デフォルトの名無しさん
NGNGゼロにはならないのでは?
0906デフォルトの名無しさん
NGNG>>742
あれから100以上もひっぱった736の連中、氏ね。
0907デフォルトの名無しさん
NGNGみんな同期問題の方に目がいっちゃってたね。
0908デフォルトの名無しさん
NGNGgetって削除された要素を飛ばして次の要素を返すんじゃないか?
あと、removeが値を返してるよ。
>>905
その参照を増やす手段がgetなんだけど…
0909デフォルトの名無しさん
NGNGをちゃんと保持しないと。変数に代入したらちゃんと参照カウント
増やせ。
0910デフォルトの名無しさん
NGNGなんだから、まともなGC使えってば...
0911デフォルトの名無しさん
NGNGスレッド A からスレッド B に参照を代入しようとしている。同時にスレッド C が
参照を開放しようとしている。
最初の時点で参照を持っているのは A と C だから参照数は 2、C がカウントダウン
したところで参照数は 1、そのあと B に代入されてカウントは 2 になる。
これのどこに参照数 0 になる要素があるか答えよ (同期化は当然行っている
とする)。
# と断言して俺が間違ってたら恥ずかしいわけだが…
0912デフォルトの名無しさん
NGNG0913デフォルトの名無しさん
NGNG0914デフォルトの名無しさん
NGNGスレッドの数だけ数えりゃ良いわけじゃないって言うとるに。
ヒープ上のデータ(たとえばリスト)から参照されてて、
そのリストを指しているのはスレッドDだけだったとする。
あんたの数え方だと、スレッドAとBが参照を離したら、
リストから指されてるのに解放されちゃうよ。
また、同じスレッドの中でメソッド呼び出しに参照を渡した
とする。この時にも参照を増やさないと。呼び出された先で
参照が不要になったからって勝手にカウントダウンしたら
呼び出し元が困るだろ。
0915デフォルトの名無しさん
NGNGでも、C++みたいな言語でGCも怖い気がする。
GCのバグ云々じゃなく、相当気をつけて使わないと、GCと
例外機構やデストラクタが衝突してあぼーん、になりそうで
不安。Cの方がまだしも、処理系の動きが見えやすいだけ、
楽な気がする。
0916デフォルトの名無しさん
NGNG後半は普通につかってりゃありえんだろ
0917デフォルトの名無しさん
NGNG>あんたの数え方だと、スレッドAとBが参照を離したら、
>リストから指されてるのに解放されちゃうよ。
914をどう読むとそういう数え方になるんだ?
>また、同じスレッドの中でメソッド呼び出しに参照を渡した
>とする。この時にも参照を増やさないと。呼び出された先で
>参照が不要になったからって勝手にカウントダウンしたら
>呼び出し元が困るだろ。
それは弱い参照にするかどうかだよね。呼び出された先が、
どこにもその参照を突っ込まないで、カウントを変えないまま
リターンすれば問題ないわけで。
参照カウントの有難味は無くなるけど。
0918デフォルトの名無しさん
NGNGいや、index が識別子なのか単なる順序値なのかわからんし、
一応こうしといた。
remove は中途半端になっちまった。引数の型も抜けてるし。
中で release する場合と、オブジェクトを返して外で release する
場合と考えてた。
0919デフォルトの名無しさん
NGNG数え方をするから間違える。
シングルスレッドでも参照カウントはちゃんと増減させるだろ?
とにかく「何ヶ所から指されているか」を正しく参照カウント
に反映させておかないと。
メソッド呼び出しではたしかに人間が推論して最適化すること
はあるね。間違いのもとだけど。
0920デフォルトの名無しさん
NGNGスレッド D が持つリストからも参照されてるなら初期状態での参照数は 3 だろ。
逝っておくがいくつのスレッドで共有されているかをカウントしているという意味
ではないぞ。
ただ循環参照になってるとどこからも使われてないのに参照数が残ってしまう
だろうな。単純な参照カウントの弱いところだ。
0921767=793=902
NGNGとりあえずリスト全体ロックは回避できたんだから、これくらい(複数のロックを使う)で
手を打つのがよいと思うのだが。
あとは、refcount が 0 になってもその場では削除せず、後で回収するくらいしか
無いと思う。もちろん回収の時は、全スレッドを安全な場所で停止させる必要があるが。
っつーかもっといい手があるのかどうか俺も知りたい。
0922デフォルトの名無しさん
NGNG∧_∧
∧_∧ (´<_` )
( ´_ゝ`) / ⌒i さすがだな兄者。
/ \ | |
/ / ̄ ̄ ̄ ̄/ |
__(__ニつ/ FIVA / .| .|____
\/____/ (u ⊃
0923772
NGNG#なんか終息しかけてますけど、まあ話題としては面白いのでいいけど。
ええと、>>788が重要な指摘だと思いますよ。
>>786の「実際には目的のデータであることを確認後」
この確認はどういうコードで行っているのですか?
ぱっと思いつくコードは例えばこうなんですけど。
//目的のデータであることを確認
O3 = O1 ; //ここで既に参照カウントが上がってる!
if (! IsWanted(O3)) {
//O3生成の瞬間にO1が破棄されているとO3に新規データが入っている
//エラー処理
}
O2 = O1 ; //既にO3があるのでO2は要らないけど安全にコピーできる。
なんか私大間違いしてます?
0924デフォルトの名無しさん
NGNGremoveはやっぱり出来ないんじゃないかなー。
単方向リストでも、双方向リストでも、配列+ホールでも…
少なくとも「n番目getする」という操作は正しく動かないだろう。
「キーkを持つ要素をgetする」ときも、一部だけロックで出来る?
0925デフォルトの名無しさん
NGNG0926デフォルトの名無しさん
NGNG0927デフォルトの名無しさん
NGNGまぁこれでも見てマターリしる
0928デフォルトの名無しさん
NGNGjdk1.2以降ですな。
0929デフォルトの名無しさん
NGNGthread safety についてというか、1.1 までのコレクションは莫迦でも使えるように
何でもかんでも同期化してただけ。
0930デフォルトの名無しさん
NGNG>ConcurrentModificationException
>...
>たとえば、あるスレッドが Collection で繰り返し処理を行なっている間に、
>別のスレッドがその Collection を変更することは通常許可されません。
通常ダメなんだとさ。
0931デフォルトの名無しさん
NGNG0932デフォルトの名無しさん
NGNG0933デフォルトの名無しさん
NGNGじゃあ、いまでもVectorとか使ってるばかには使わせといた方がいいんですか?
0934デフォルトの名無しさん
NGNG0935デフォルトの名無しさん
NGNGでも、たま〜に使いたくなることあるなぁ。。。
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNG散々人を見下した発言を繰り返した割には、反論できずにだんまりかよ
ヘタレやの、おまえ
0938デフォルトの名無しさん
NGNGもういいよ・・・
0939デフォルトの名無しさん
NGNG938 名前:736 投稿日:02/11/16 22:31
>>937
もういいよ・・・
0940デフォルトの名無しさん
NGNGもっと踊ってくれよ
0941772
NGNGあ、違った。O1がBスレッドにあるという時点で
既に参照カウントがアガってなきゃいかんのか。
鬱だ…。
DataType O1;
hr = pDataList->GetItem(index, &O1) ;
if (FAILED(hr)) { /* エラー*/ }
if (IsWanted(O1)
とか。ふむ。確かにリスト側で排他したくなるし、
同時に他スレッドで削除されてると面倒。やっと分かった。
0942767=793=902=918=921
NGNG参照を得る/切るタイミングでアトミックにカウントが上がる/下がる必要が
あるからなぁ。
そうでないと、無効なオブジェクトを参照してしまう。
ならば、参照カウントが 0 でも有効な(というより、無効かどうか判別できる)
ものを作るのも一つの手だな。
bool Object::ref(){
bool valid = false;
cs_.enter();
if(refCount_ > 0){
refCount_++;
valid = true;
}
cs_.leave();
return result;
}
void Object::release(){
cs_.enter();
if(refCount_ > 0){
refCount_--;
if(refCount_ == 0){
garbages__.add(this);
}
}
cs_leave();
}
で、安全なタイミングで(ってそれが一番むずい気も)garbages__(グローバル変数)
の要素を delete してやると。
0943942
NGNGあるいは、Object ではなく、SharedPtr みたいな入れ物でこれをやっても良い。
SharedPtr のフィールドは Object* を格納する ptr_ と refCount_。refCount_ が
0 になったときに delete ptr_ するけど、 SharedPtr 自体は無効な状態で
残り、garbages__ に入る。
コメントくれ 736。もしくは偉い人。
0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNG736でも偉い人でもないが…
ref()がfalseを返したら、いったい何をすればよいんだ?
そもそも、release()で参照が0になるということは、release()を呼んだスレッド
以外からの参照はないはずなのに、他からref()が呼ばれるのがおかしいってば。
リストのgetとremoveが排他制御をちゃんとやれば、そういうことは起きないだろ?
getがロックを離す前にはrefが済んでいる。あるいは、removeが先なら、
参照が他のスレッドに渡ることはない。
0947デフォルトの名無しさん
NGNG0948デフォルトの名無しさん
NGNG一生悩みつづけるC++プログラマのスレはここですか?
0949デフォルトの名無しさん
NGNGの736祭は。
0950デフォルトの名無しさん
NGNG>>930
0951デフォルトの名無しさん
NGNGうん
だからオマエには関係ないんよ
どっか逝け、二度と来んな
0953デフォルトの名無しさん
NGNG特殊な場合はあるかもしれんが、一般的なリストのセマンティクスを
ロックなしで一貫性を持って実現するのは無理だろう。
たとえば
「n番目を取り出す」→他のスレッドが先頭を削除したら、戻ったときには正しくない値を返してしまう。
「データxを含む最初の要素を取り出す」→探索中に他のスレッドが先頭にxを
付け加えたら…
0954942
NGNGその特殊な場合が知りたい。
そのために、902 の List::remove では、items_[index] = NULL をもって
要素削除としてる。
いや、現実問題、こんなことしてたら、List も Object も、使う側に
知識を要求する、やっかいなクラスになるとは思う。
ただ、そうすることによってパフォーマンスが得られるなら、
それが有効な選択肢になる場合もある。
ってことで、無理問答みたいなことを続けてるわけだ。
っていうか 736 が続けてくれよこれ。
0955デフォルトの名無しさん
NGNGhttp://www.gotw.ca/gotw/045.htm
void String::AboutToModify(size_t n, bool bMarkUnshareable /* = false */)
int refs = IntAtomicGet( data_->refs );
if( refs > 1 && refs != Unshareable ) {
StringBuf* newdata = new StringBuf( *data_, n );
if( IntAtomicDecrement( data_->refs ) < 1 ) {
delete newdata; // just in case two threads
} // are trying this at once
else { // now all the real work is
data_ = newdata; // done, so take ownership
}
} else {
data_->Reserve( n );
}
data_->refs = bMarkUnshareable ? Unshareable : 1;
}
の、delete newdataって間違いじゃない?
0956955
NGNGそれぞれが共有を解除して、独自にデータを持つわけだが、その内の一つは
data_->refs が0になるから、元の共有していたdata_の指す先か、newdataの
一方を開放する必要がある。
というのは判るんだけど、AbountToModifyは共有解除と共にsize_t nに
データ領域のサイズを拡張しなきゃならんのに、delete newdataでは
data_の指す先の領域のサイズはsize_t nだけあるとは限らなくない?
ここは、単純に
if( IntAtomicDecrement( data_->refs ) < 1 ) {
delete data_; // just in case two threads
}
data_ = newdata; // done, so take ownership
じゃないかと思うんだが…
0957名無しさん@カラアゲうまうま
NGNGif( IntAtomicDecrement( data_->refs ) < 1 ) {
delete newdata; // just in case two threads
data_->Reserve( n );
} // are trying this at once
0958955
NGNGでも、既にnewdataはサイズn以上で領域確保しているので、
data_を破棄する方が良いかと。
誰も、反論が無いところを見ると、やっぱり間違いと言う事でよろしいか?
0959デフォルトの名無しさん
NGNG使っちゃいかんと思うが...
0960名無しさん@カラアゲうまうま
NGNGいいんじゃん。
ところで、次スレって立てんの?
0961デフォルトの名無しさん
NGNG別にリファレンスカウントでアロケーション回数を少なくしてパフォーマンスを稼ごう
という事ではなくて、そもそも大域的なデータをマルチスレッドで使う時には意味無いかな?
0962デフォルトの名無しさん
NGNGマルチスレッドプログラミングの苦労はすべて、
C++を使う事が原因だと結論が出たので、
次スレは不要でしょう。
0963デフォルトの名無しさん
NGNG0964963
NGNG0965デフォルトの名無しさん
NGNGどっちかというと、不要なのはオマエだな
0966次スレの逝ってよしの1
NGNGhttp://pc3.2ch.net/test/read.cgi/tech/1037636153/
間違えて3つも立ててしまった・・・
決してマルチスレッドとかけたわけではありませぬ・・・
0967デフォルトの名無しさん
NGNG0968デフォルトの名無しさん
NGNG次スレには全部重複ごめん、次スレはこちら、と書いてあり
リンクをたどると無限ループするんだが・・・。
0969デフォルトの名無しさん
NGNG削除依頼板に書いてあるとおりです
0970デフォルトの名無しさん
NGNG0971デフォルトの名無しさん
NGNG0972デフォルトの名無しさん
NGNG明らかに故意に串を差し替えるとか回線を繋ぎ替えるかして
立てたはずだ。
市ねよ。
0973デフォルトの名無しさん
NGNG素朴な参照カウントモデルは循環参照があると
役に立たないのです
0974次スレの逝ってよしの1
NGNGいえ、それが同じアドレスから3連発したのです
一度目はコネクションタイムアウト
二度目は30秒ぐらいでこちらから停止
三度目で成功
で、気づいたら3つ立ってました(;_;)
一回目の段階で、しばらく待って、スレ一覧をチェックすればよかったんですね。
しばらくスレ立てはやめときます・・・
0975デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNG> 素朴な参照カウントモデルは循環参照があると
うん、それで?
参照カウントを使って、どんな場合にも使えるクラスを設計しようとしてるならともかく、
循環参照が発生しないデータモデルで使用する場合には、何の意味も無いな。
>972
スレが3つ立ったからって、そんなに迷惑被ったのかヨ?
引きこもりは、攻撃性が強くて困るな。
0977デフォルトの名無しさん
NGNG「リンクをたどると無限ループ」に引っ掛けたネタに
マジレスされても困るのだが
0978デフォルトの名無しさん
NGNGネタニマジレスカコワルイ
>>976
ネタノカイセツカコワルイ
0979デフォルトの名無しさん
NGNG>>976 -> >>977
ネタノテイセイカコワルイ
イッテキマス...
0980デフォルトの名無しさん
NGNG????するならイマノウチ
0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNG0983デフォルトの名無しさん
NGNG0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNGぬるぽぬるぽぬるぽぬるぽぬるぽ
ぬ る ぽ ー っ ! ! !
0986デフォルトの名無しさん
NGNGレス数が950を超えています。1000を超えると書き込みができなくなります。