マルチスレッドプログラミング相談室 その2
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNGOS・言語・環境は問わないが、それゆえ明記すべし。
これといったリンク先がないので>>2はブラクラ。
00022
NGNG0003デフォルトの名無しさん
NGNG00041
NGNG0005デフォルトの名無しさん
NGNG後の始末はオタな方々が行ってくれるでしょう。
00061
NGNGだします。すみませんです。
0007デフォルトの名無しさん
NGNGマルチスレッドプログラミング相談室
http://pc3.2ch.net/test/read.cgi/tech/997345868/
0008デフォルトの名無しさん
NGNG0010デフォルトの名無しさん
NGNGおながいします。
0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNGこちらが本スレになる予定です
http://pc3.2ch.net/test/read.cgi/tech/1037636602/l50
お手数かけてすみません。
0015デフォルトの名無しさん
NGNG0016デフォルトの名無しさん
NGNG後の始末は削除な方々が行ってくれるでしょう。
0017デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNGunlock(...)することを保証するにはどうしたらよいでしょう?
returnで返る前には自分でunlockしていますが、longjmpやthrow
のときにはunlockされないので困っています。
0019デフォルトの名無しさん
NGNG0020デフォルトの名無しさん
NGNG無理。Java使え。
0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNGこれ
ttp://homepage2.nifty.com/rohizuka/ka/pa_003_a.htm
0023デフォルトの名無しさん
NGNG0024名無しさん@カラアゲうまうま
NGNGthrowならデストラクタは実行される。
つーかそんなの全然マルチスレッドに限った話題じゃない。
0025デフォルトの名無しさん
NGNG出るときにロック壊しちゃって委員会?
0026名無しさん@カラアゲうまうま
NGNGるってこと。
C++のidiomを知らないんならARMから読み直せ。
002818
NGNG素直にJavaを使って書くことにします。
0029デフォルトの名無しさん
NGNGpublic:
AutoLock() { lock(); }
~AutoLock() { unlock(); }
};
F()
{
try {
AutoLock autoLock;
} catch (...) {
throw;
}
}
0030名無しさん@カラアゲうまうま
NGNG763==736だがな。
>>28
つーか、スレ違い。
0031名無しさん@カラアゲうまうま
NGNGtry, catchは要らないはず。
0032デフォルトの名無しさん
NGNGそうだぞ。正しいunlock()の仕方なんてスレ違いだぞ。
0033デフォルトの名無しさん
NGNGマルチスレッドに限った話題じゃないが、マルチスレッド
プログラミングで必要な話題ではあるだろう。
0034デフォルトの名無しさん
NGNGえっらそーに。
0035名無しさん@カラアゲうまうま
NGNGすまん、それもそうだ。
0036名無しさん@カラアゲうまうま
NGNGカラアゲを冒涜すると頃すぞ。
0037デフォルトの名無しさん
NGNG736 といい、こいつといい、このスレの伝統ですか?
0038デフォルトの名無しさん
NGNG俺の脳、処理能力低いので普段はシングル処理ですが、
仕事中だけマルチになります。
2ちゃんねるやったりwinMXでエロやアニメ落としまくったり私用のメールやりとりしたり
女子社員のいろんな妄想したり見つからないようにお菓子食ったり、
その合間に仕事したり
0039デフォルトの名無しさん
NGNG0040デフォルトの名無しさん
NGNGpthread_mutex_t& lock;
UnlockHook(pthread_mutex_t& l) : lock(l) {}
~UnlockHook() { pthread_mutex_destroy(&lock); }
};
...
pthread_mutex_lock(l1);
{
UnlockHook hook(l1);
.... // throw されるかも ...
}
これでhookのデストラクタがちゃんと呼ばれるんだろうけど、
いったいどうやってるんだろう?
ひょっとして、throwってすごく遅い?
0041デフォルトの名無しさん
NGNG0042デフォルトの名無しさん
NGNG0043rubyist@カラアゲうまうま
NGNG子供:あはははは。
パパ:わっはっは。これは傑作だ。
0044デフォルトの名無しさん
NGNG> ひょっとして、throwってすごく遅い?
つーか、重いデストラクタがいっぱい走る状況なら、return だけでもすごく遅いと思うが...。
0045デフォルトの名無しさん
NGNG重いかどうかは処理系によるけど、まあ想像つくわな。
でも想像でしかないわけで、最近での処理系でのオーバーヘッドって
どれくらいのもんなのだろう。
0046デフォルトの名無しさん
NGNG#include <unistd.h>
#include <sys/time.h>
static void no_exception() { }
static void use_exception() { try { throw 0; } catch (...) { } }
static void eval(void (*p)()) {
timeval before, after, r;
gettimeofday(&before, NULL);
for (int i = 0; i < 100000; i++) {
p(); p(); p(); p(); p(); p(); p(); p(); p(); p();
}
gettimeofday(&after, NULL);
timersub(&after, &before, &r);
printf("%ld.%03ld\n", r.tv_sec, r.tv_usec / 1000L);
}
int main() {
eval(no_exception);
eval(use_exception);
return 0;
}
Athlon 1.4GHz g++ 2.96 -O2
0.004
5.579
0047デフォルトの名無しさん
NGNG0048デフォルトの名無しさん
NGNGInterlockedExchangeとInterlockedExchangePointerってなにが違うんでしょう?
InterlockedExchange
If you are exchanging pointer values, this function has been superseded by the InterlockedExchangePointer function.
InterlockedExchangePointer
If you are exchanging pointer values, this function supersedes the InterlockedExchange function.
意味不明なんですが
0049736
NGNGカスども元気か?
0050デフォルトの名無しさん
NGNGPVOIDとLONGのサイズが一緒じゃない場合があるからだろ。
M$の64ビット環境では、longは32ビットのままじゃなかったっけ?
005148
NGNGそういう事ですか。さんくす。
64bitだと、intは32bitもしくは64bitでlongも64bitだと思ってました。
そういえば、LONG LONGなんてのがありましたね。
0052デフォルトの名無しさん
NGNG0053デフォルトの名無しさん
NGNG0054デフォルトの名無しさん
NGNG劇的に速くなった香具師はいますか?
005550
NGNGLONG LONGではなく、LONGLONGだね。
M$の場合は、longが32bitで、__int64が64ビット。
__int128なんかも予約されていたような気がする。
普通の64bitな処理系ではlongが64bit。
0056デフォルトの名無しさん
NGNG0057デフォルトの名無しさん
NGNGLP64という慣習に従った処理系。
0058デフォルトの名無しさん
NGNG50=55の脳内処理系のことでしょう。
少なくとも普通じゃない。
0059デフォルトの名無しさん
NGNG0061デフォルトの名無しさん
NGNG0062デフォルトの名無しさん
NGNGローカル規格団体?
0063デフォルトの名無しさん
NGNG0064デフォルトの名無しさん
NGNGTHX. unix方面限定ってことね。
0065デフォルトの名無しさん
NGNGCPU-boundな処理を2つのスレッドに分けるのはなかなか大変よ。
通常は分けるとしてもCPU-bound(ひとつ)、I/O-bound(ふくすう)
だからねえ・・・
並列アルゴリズムを応用するといっても、CPU数が高々4つだろうから
通信オーバーヘッドが目立つだけかも。
0066デフォルトの名無しさん
NGNGいや、SUSとPOSIXは統合された。だから標準に準拠したOSならすべて。
ちなみにWinNT, Win2kもPOSIX互換、と少なくともMSは主張してる。
0067デフォルトの名無しさん
NGNG見たことないけど。
0068デフォルトの名無しさん
NGNGIEEE std.1003.1-2001 (POSIX V6)では、getconf nameとして
_POSIX_V6_ILP32_OFF32, _POSIX_V6_ILP32_OFFBIG,
_POSIX_V6_LP64_OFF64, _POSIX_V6_LPBIG_OFFBIG
が定義された。すべての処理系は、上の少なくとも1つをサポートしなければ
ならない。
0069デフォルトの名無しさん
NGNGそれぞれどういう意味?
0070デフォルトの名無しさん
NGNGIntel(R) Celeron(R) CPU 1.70GHz (RedHat Linux 7.3)
0.007
5.567
AMD-K6(tm)-III Processor (Sun Cobalt Linux)
0.028
12.291
0071デフォルトの名無しさん
NGNGコンパイラはそれぞれ何?
0072デフォルトの名無しさん
NGNG0073デフォルトの名無しさん
NGNGプログラミング環境 int long ポインタ off_t
_POSIX_V6_ILP32_OFF32 32 32 32 32
_POSIX_V6_ILP32_OFFBIG 32 32 32 >=64
_POSIX_V6_LP64_OFF64 32 64 64 64
_POSIX_V6_LPBIG_OFFBIG >=32 >=64 >=64 >=64
0074デフォルトの名無しさん
NGNGlongはint以上の長さを持つ。
最低32ビット。
long longはlong以上の長さを持つ。
最低64ビット。
0075デフォルトの名無しさん
NGNG0076デフォルトの名無しさん
NGNG0077デフォルトの名無しさん
NGNG0078デフォルトの名無しさん
NGNG0079デフォルトの名無しさん
NGNGそんな半端なことしては意味がないと思うんだが
0080デフォルトの名無しさん
NGNGhttp://support.microsoft.com/default.aspx?scid=KB;en-us;q149902
> The POSIX interface on Windows NT strictly follows
> the POSIX 1003.1-1990 standards.
つまり1003.1-1990 comformantであって1003.1:1990 comformant
ではないと。
0081デフォルトの名無しさん
NGNG1003.1:1990→1003.1-2001だ
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNGlinuxも完備してるわけじゃないし・・・
0084デフォルトの名無しさん
NGNGLinuxのどこがPOSIXじゃないの?
0085デフォルトの名無しさん
NGNGこれだから犬厨は・・・
0086デフォルトの名無しさん
NGNG他のディストリビューションは、
「やればできることは(FTのおかげで)わかったから、わざわざ金かけるまでも
ないや」ということで、認定は受けていないが、ほぼPosix-compliantと言ってよい。
>>85
犬厨って何?
0088デフォルトの名無しさん
NGNGはー、なるほど。Winな人が使う蔑称ってことね。
0089デフォルトの名無しさん
NGNGま た 犬 厨 か 。
0090デフォルトの名無しさん
NGNG原因だな。
0091デフォルトの名無しさん
NGNG0092デフォルトの名無しさん
NGNG( ´∀`) < オナラモナー
( ) \_____
| | |
(__)_)
0093デフォルトの名無しさん
NGNG0094デフォルトの名無しさん
NGNG0095デフォルトの名無しさん
NGNGウォシュレット最強は TOTO ですがなにか?
0096デフォルトの名無しさん
NGNG> ウォシュレット最強は TOTO ですがなにか?
そりゃ当たり前だろ。
「ウォークマン最強は SONY です。」と言ってんのと同じだよ。
ちなみに、シャワートイレ最強は INAX ですが、それが何か ?
0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNGここはウンチスレッドプログラミングについて語るスレですが、何か?
0099デフォルトの名無しさん
NGNG0100デフォルトの名無しさん
NGNG単にバッファが個別にあるだけと思われる。
排出自体は、DMA じゃねーのか ?
CPU からの命令ですぐ止まらないし...。
0101デフォルトの名無しさん
NGNGですか?(ちと苦しいか)
0102デフォルトの名無しさん
NGNG浣腸より痛いぞ。
0103デフォルトの名無しさん
NGNGTOTO が最強だって信じてる奴がこの世にいたのか!?
ぶぁっはははははーーーっ!!
ぶぁっはははははーーーっ!!
0104デフォルトの名無しさん
NGNGおまいは最強の
\ 馬 / \ 鹿 /
∩ ∩
| つ 「,"|
ヾ∧ !,'っ_ ⊂_,!
/ ・ |ミ / ・ ヽつ
(_'... |ミ ▼,__ |
(゚Д゚; )..|ミ (゚Д゚ ,)・|
(| .、)| (| 、)|
| | | ・・|
ヽ.._人 ヽ._・ν
U"U U"U
だな・・・。
0105デフォルトの名無しさん
NGNG0106デフォルトの名無しさん
NGNG>>85
0107デフォルトの名無しさん
NGNG>>91
0108デフォルトの名無しさん
NGNG0109デフォルトの名無しさん
NGNG0110デフォルトの名無しさん
NGNGお父さんは悲しいよ。
0111デフォルトの名無しさん
NGNG0112デフォルトの名無しさん
NGNG0113デフォルトの名無しさん
NGNG0114デフォルトの名無しさん
NGNGよいことだ。
0115デフォルトの名無しさん
NGNG× げいいん
○ げんいん(原因)
0116デフォルトの名無しさん
NGNG0117デフォルトの名無しさん
NGNG0118デフォルトの名無しさん
NGNGおまいは 「がいしゅつ」 とかもいちいち訂正するのかと
0119デフォルトの名無しさん
NGNG× がいしゅつ
○ きしゅつ(既出)
0120デフォルトの名無しさん
NGNG2 ちゃんねるでは
× きしゅつ
○ がいしゅつ
× げんいん
○ げいいん
だからよろしくな。
0121デフォルトの名無しさん
NGNGがいしゅつか間違いだと思っている奴がこの世にいたのか!?
ぶぁっはははははーーーっ!!
ぶぁっはははははーーーっ!!
0122デフォルトの名無しさん
NGNG× がいしゅつか間違いだと思っている奴がこの世にいたのか!?
○ がいしゅつが間違いだと思っている奴がこの世にいたのか!?
0123デフォルトの名無しさん
NGNG最適化されなければいけないそうですね。
OSXならば、OSX対応アプリならdual processorに標準対応ですな。
0124デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNG0126デフォルトの名無しさん
NGNG0127デフォルトの名無しさん
NGNGはいはい、よかったですね。
満足したら、MAC 板に帰ってくださいね。
0128デフォルトの名無しさん
NGNGシングルスレッドのアプリが自動的に速くなるわけがない。
0129デフォルトの名無しさん
NGNGAppleの技術力をナメてませんかぁ?
NEXT時代から培ってきた技術は、今、最高の時期を迎えています。
そんなマックをただのUNIX呼ばわりする馬鹿は、逝ってよしってことです。
0130デフォルトの名無しさん
NGNG0131デフォルトの名無しさん
NGNG0132デフォルトの名無しさん
NGNG0133デフォルトの名無しさん
NGNGマルチスレッド実行するOSなんてあるわきゃない。
0134デフォルトの名無しさん
NGNG0135デフォルトの名無しさん
NGNG自動的に排他制御と同期を挿入して…なんて確かに不可能だね。
0136デフォルトの名無しさん
NGNGマルチプロセスだろ。
そう設計されてない限り、マルチスレッドにする事はできない。
0137デフォルトの名無しさん
NGNG132 と 129 は大いに馬鹿にしたい。
0138137
NGNGでも、132 を馬鹿にしたいというのも正しいw
0139デフォルトの名無しさん
NGNG「ハードで」ならマルチスレッド化は可能?
0140デフォルトの名無しさん
NGNGマルチスレッドの意味わかってるか?
0141デフォルトの名無しさん
NGNG2Pとか3Pとか乱交とかそういう意味だろ?
インテルのHTってチムポが2本になるんだよな?
0142デフォルトの名無しさん
NGNGその通り。
おまいの脳内においてのみナー。
0143デフォルトの名無しさん
NGNGMultiscalerとかSKYとかの事を言ってるなら、
あれも「自動マルチスレッド化」ではない。
0144デフォルトの名無しさん
NGNGいやせめてソースのトランスレータでもあれば随分ありがたいな。
・・・ほとんどあり得ないと思うけど。
0145デフォルトの名無しさん
NGNG並列最適化しながら実行することもできる・・・
かもしれない
0146デフォルトの名無しさん
NGNGまさか。だったらJavaでできてるはず。
0147デフォルトの名無しさん
NGNGクラス関数をスレッドとすることはできないのでしょうか
_beginthread(&LoadCharacterData, 0, NULL);
とやると
error C2276: '&' : 仮想関数のアドレスを取ろうとしました。
と起こられてしまいます
0148デフォルトの名無しさん
NGNGstatic関数にインスタンスのポインタを渡して、そっからメンバ関数を呼ぶ。
0149デフォルトの名無しさん
NGNG0150144
NGNGつまり、人間に最適化できるならコンピュータにも最適化させる事ができるという事だ。
誰か挑戦する猛者は居ないか?
0151デフォルトの名無しさん
NGNGネタとしては面白いので
最近の研究事例をひっぱってくれ
0152デフォルトの名無しさん
NGNG人間もチューリング等価だと?
0153デフォルトの名無しさん
NGNGfor( int i = 0; i<max; i++ ) sum += f(i);
とあったら、(f(x)は数学的関数)
t1:for( int i=0; i<max/2; i++ )
{ tmp = f(i); lock(sum); sum += tmp; unlock(sum);}
t2:for( int i=max/2; i<max; i++ )
{ tmp = f(i); lock(sum); sum += tmp; unlock(sum);}
に自動分解するソフト?
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNGそんなのはFortranのコンパイラがとっくにやってる。
0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNG_beginthreadex とかで指定するスタック領域を増やすのと、
TLS(Thread-Specific Storage)使うのはどっちが効率がいいのでしょうか?
buffer領域の場所を使うバッファにいちいち教えてあげる TLS は
面倒なので、効率が変わらなければ、スタック領域の方が便利なような気がします。
誰かおしえてちょ。
0159デフォルトの名無しさん
NGNGマルチスレッドなんだから
スレがいくつか平行に存在してていいじゃないか。
0160
NGNGTLS はそういうものじゃないし、効率はスタックの方がいいよ。
そもそも 158 の考えている使い方なら TLS なんかいらないでしょ。
0161デフォルトの名無しさん
NGNGLどこー?
0162デフォルトの名無しさん
NGNGTLSって
Thread Local Storage
じゃなかったのか?
0163デフォルトの名無しさん
NGNGTSD Thread Specific Data - pthread
TLS Thread Local Storage - Win32
どっちも同じもの。
0164160
NGNG160は不親切だったので追記する。
TLS は unix だと signal ハンドラやら、windows だと hookproc の中やら、
現在実行中のスレッドがよーわからん&引数として(スタックフレームで)適当な
データもよう使えんときに、スレッド毎に必要なデータを使うためにある。
マルチスレッドじゃなければ(他に手立てが無くて)グローバル変数を使うような場面ね。
使わないで済むならもちろん使わない方が良い。keep it simple って観点で。
0165デフォルトの名無しさん
NGNG可能な限り使わない方がよい
0166デフォルトの名無しさん
NGNGただしVCのようなコンストラクタのあるオブジェクトを置けない
制限がどうなっているのかは不明。
0167デフォルトの名無しさん
NGNG昨年、2ちゃんねるにおいてタシロ祭りを巻き起こした
「TIME誌 Person of the Year」投票。
ところが昨年の投票に懲りたのか、TIME誌は投票可能な人物を
あらかじめ設定するという方法に出てきました。これは黙っていられません。
2ちゃんねらーの力で、彼ら米国人が最も無視したい人物
「Yasser Arafat」アラファト議長を表紙に!!
ところがここに邪魔をする一つの謎の集団が突如現れました、
彼等はこともあろうに現イスラエル首相、シャロンに一斉砲撃を開始!
瞬く間にアラファトを蹴落として首位の座に君臨しました。
その強烈な攻撃は、ユダヤ勢力対2ちゃんねらという構図を予想させ、
戦いは一時、圧倒的な差を以てシャロンの完全勝利として終結しつつありました
しかし、我々は諦めずに抗戦。現在、じわりじわりと反撃の炎が立ち上り始めています。
今ならまだ間に合います。
勇気ある君の一票が伝説になる!
http://live.2ch.net/test/read.cgi/festival/1039909795/
0168デフォルトの名無しさん
NGNGハァ?
普通に使ってる限り足りなくなることなんかないだろ。
まさか個々の変数に対して割り当ててるんじゃないよな?
0169デフォルトの名無しさん
NGNGWindows2000以降では制限が緩くなったが
それより古いOSでは1プロセスあたり64
TLSを用いるDLLを多用するとまずい
普通に使ってる限り足りなくなることはないということは同意
でも>>158みたいなことをしていれば足りなくなる可能性もある
0170デフォルトの名無しさん
NGNGプラグイン方式だったりしてもやばい
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNGのデバッグってどうやればよいのでしょうか?
0173デフォルトの名無しさん
NGNGそれって
前スレとか前々スレとかで見かけた気がするぞ。
ネタか?
0174デフォルトの名無しさん
NGNG教えてやってよ
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNGネタじゃねえの。
0177デフォルトの名無しさん
NGNG入れ子みたいにするのマズイですか?
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNGOS板のBeO信者はパーヴァシブスレッドっていったかなんだか忘れたが、
できると豪語してたぞ。ただの電波かもしれない。
0180デフォルトの名無しさん
NGNG確かBeのウィンドウアプリはデフォルトでスレッド2・3本作ってるって
話を聞いたけどそのことじゃないの。
0181デフォルトの名無しさん
NGNGっていうか、それで速度的に有利になる状況というのがあんまり考えられないけど。
0182デフォルトの名無しさん
NGNGMFCだってMTでコンパイルすればウインドウくらいは
そうなってんじゃないの?
0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNGC Runtime が MT Safe になるだけ。
0186デフォルトの名無しさん
NGNGたしかWin32マルチスレッドって本に書いてあった。
0187デフォルトの名無しさん
NGNGそれはOS側のメッセージディスパッチャ内部で起動されるスレッドの
話であって、アプリがマルチスレッド化される話とは別。
つか、タスクマネージャでスレッド数見りゃ分かるやん。
0188デフォルトの名無しさん
NGNGそうやって複数のスレッドをいきなり立てたって、それぞれを何に使うんだ?
0189デフォルトの名無しさん
NGNG活動するのですよ。
0190デフォルトの名無しさん
NGNGと言うのか?
どうやって?
0191デフォルトの名無しさん
NGNG0192デフォルトの名無しさん
NGNGpublic:
static void Thread(void*);
とスレッド関数を作って内部で呼び出しても大丈夫でしょうか?
0193192
NGNGネットワークアダプタが複数ある場合、アダプタ毎にWSARecvするので
マルチスレッドを考えてるのですが、この場合マルチスレッドは必要ないでしょうか?
複数アダプタが検出された場合、クラスラッピングしておけば用意に必要本数ができるので上記の質問をしたのですが
何分知識不足で的外れな質問かもしれません・・
後、和書か訳本でマルチスレッドのお勧めの本とかありましたら宜しければ教えてください。<(_ _)>
0194デフォルトの名無しさん
NGNGVC++なら大丈夫。
0195IP記録実験
NGNGhttp://qb.2ch.net/test/read.cgi/accuse/1042013605/
1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
0196デフォルトの名無しさん
NGNG* ※ ☆ ※ ※ ※ ☆ ※ *
* ※ ☆ ※ ※ ☆ ※ ※ ☆ ※ *
* ※ ☆ ※ ※ ☆ .☆ ※ ※ ☆ ※ *
* ※ ☆ ※ ※☆ ☆※ ※ ☆ ※ *
* ※キタ━━━━━(゚∀゚)━━━━━ !!!※ *
* ※ ☆ ※ ※☆ ☆※ ※ ☆ ※ *
* ※ ☆ ※ ※☆ .☆※ ※ ☆ ※ *
* ※ ☆ ※ ※ ☆ ※ ※ ☆ ※ *
* ※ ☆ ※ ※ ※ ☆ ※ *
0197デフォルトの名無しさん
NGNGどうせネタだし
0198デフォルトの名無しさん
NGNG0199デフォルトの名無しさん
NGNGできないです>責任逃れ
0200デフォルトの名無しさん
NGNG/:::::::ヽ____/::::::::ヽ、
丿 ::.__ .::::::::::::: __ ::::ヽ_
/ /。 ヽ_ヽv /: /。ヽ ::::::ヽ
-┼- 丿~~~| / / ̄ ̄√___丶  ̄ ̄\ ::::| ■ ■
-┼- /~~~~/ ━━━ | .:::::::::: / / tーーー|ヽ ..::::: ::|━━━━━━ ▼ ▼
.| 丿 | .:::::. ..: | |ヽ ::| ● ●
| ::: | |⊂ニヽ| | :::::| \
/ /| : | | |:::T::::| ! .::| \ \\
/ / \: ト--^^^^^┤ 丿 \\\ \\\
お、大阪・・・・
0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG0203デフォルトの名無しさん
NGNG0204デフォルトの名無しさん
NGNG2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0205デフォルトの名無しさん
NGNG違います。判決は訴状送達の翌日(初日不算入の原則)からとしてます。
0206デフォルトの名無しさん
NGNG面白くないってだけじゃなくて嫌悪感を憶えるよ
はたして大木目当てでチャンネル合わせる香具師なんかいるのか?
石橋もパクリばっかで中身ないけど
大木も負けず劣らずつまらん
こんなのは全然別の仕事定年までして
からくりビデオレターくらいなら出してやってもいいが
わざわざ金払って画面に出す意味がワカラン
事務所はコイツのどこが面白くて契約したんだ?
下積みテキトーにやれば芸無しが画面に出れるという
前例を作ったらいかんよ
あんなの一生前説レベルだろ
それでも客が不機嫌になる弊害は避けられない
0207デフォルトの名無しさん
NGNG2ch の インターネットイノベータ・インキュベータ としての役割は終焉した。
昔は井戸端会議の戯言として(いわゆる”便所の落書き”として)失笑されていたのに
今では規模的に(判例でも)”社会に影響を与えるメディア”として扱われる存在になった。
つまり、ホントは昔から違法性はあったんだけど目立たなかっただけ、ってこと。
⇒あまりにも 公序良俗 からかけ離れたサイト、それが 今も昔も 2ch の実態。
0208デフォルトの名無しさん
NGNGしょうがないでしょう、このご時世。
0209デフォルトの名無しさん
NGNG0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNGIP記録する事で基地外の書き込みが減るだろうから、なにも困る事はないだろう?
0212デフォルトの名無しさん
NGNG0213デフォルトの名無しさん
NGNG誰も何も言えない時代が来そうな伊予柑
0214デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0217デフォルトの名無しさん
NGNG気をつけてね
0218デフォルトの名無しさん
NGNGそのうちチャンとチョンには宣戦布告しなきゃならんと思ってた。
0219デフォルトの名無しさん
NGNGまぁ、ひろゆきが実際そういうことしてたとは思えないが。
0220デフォルトの名無しさん
NGNG0221デフォルトの名無しさん
NGNG0222デフォルトの名無しさん
NGNGやめろ。
0223デフォルトの名無しさん
NGNGせいぜい厨や変なこぴぺが減るぐらいで議論はなくならない。
別に変にビクツク事ないじゃん。
0224デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNG逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm
ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
0228デフォルトの名無しさん
NGNG0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGいや、ごめん。どうせループだから、公開トリップ使って遊んだだけ。本当にごめん。
0231デフォルトの名無しさん
NGNG0232名無しさん@XEmacs
NGNG> マルチスレッドを考えてるのですが、
すればいいじゃん。その方が自然だし。
0233山崎渉
NGNG0234デフォルトの名無しさん
NGNG0235山崎渉
NGNG0236デフォルトの名無しさん
NGNGhttp://piza.2ch.net/test/read.cgi/comic/960295739/
0237デフォルトの名無しさん
NGNG0238デフォルトの名無しさん
NGNG0239山崎渉
NGNG0240名無しさん@XEmacs
NGNG「もうぬるぽ」にしろ
0241デフォルトの名無しさん
NGNGガッ
0242デフォルトの名無しさん
NGNGダウンローダを作ろうとしてます。
IEコンポーネントにURLを渡してhtmlファイルをDLすると
大量のURLがDL対象だと時間がかなりかかってしまいます・・。
そこで、複数のURLを配列に入れて、その配列を引数で渡したら
マルチスレッドで、それらのページ(画像とかじゃなくhtmlファイル)を
うりゃ〜っと高速DLしてくれるようなActiveXが作りたいのですが、
何をどうしていいのやら・・。
・このActiveX作成に最適な言語
・参考となりそうなサイトor書籍
・ヒント全般
・答え
など、教えていただけないでしょうか?
0243デフォルトの名無しさん
NGNG( ゚д゚) ポカーン
0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNGレスポンス待ち時間の分くらいしか速くならないのに。
むしろ、コネクション数をうまく調整しないと却って遅くなるぞ。
0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNGだから何?
0248デフォルトの名無しさん
NGNGそれで何?
0249デフォルトの名無しさん
NGNGつまり何?
0250デフォルトの名無しさん
NGNGすると何?
0251デフォルトの名無しさん
NGNGならば何?
0252デフォルトの名無しさん
NGNGぬるぽ何?
0253デフォルトの名無しさん
NGNG御何?
0254名無し@沢村
NGNG呼んだ?
0255デフォルトの名無しさん
NGNG無効の竹垣に竹立てかけたのは竹立てかけたかったから?
0256デフォルトの名無しさん
NGNG256ゲットですが何か?
0257デフォルトの名無しさん
NGNGひざまずけ、命乞いをしろ?
0258名無し@沢村
NGNGMUTEXマンセー
0259デフォルトの名無しさん
NGNG「>>246に取りあえずレスするスレ」
になりますた
0260デフォルトの名無しさん
NGNG259 が 246 に対してレスしてないよ?
0261デフォルトの名無しさん
NGNGbasic_stringってthread-safe?
0262デフォルトの名無しさん
NGNGつかstd::でスレッド安全性を考慮したものってあるのか?
0263デフォルトの名無しさん
NGNGheaderみれば乗ってる。
mapやvectorはスレッドセーフにできそうだが
0264デフォルトの名無しさん
NGNGまだCの癖が抜けてないのかな
0265デフォルトの名無しさん
NGNG挿入や削除ですぐ反復子が無効になるSTLをどうやったらMT-safeにできるのか
考えてみてくれ。現在並みの性能要件と機能性を満たした形で、
本当にできると思ってるの?
例えばthread Aとthread Bで同じコンテナインスタンスの反復子を
それぞれいじくっても平気か、ということだ。
0266デフォルトの名無しさん
NGNGもちつけ。
>>264がいいたいのはそういうことでは無いと思われ。
0267デフォルトの名無しさん
NGNGサブスレッドがGetDC()を実行して
サブスレッドがGetDC()を実行しても
いいのでしょうか?
これらのAPIは、裏で排他処理をしていますか?
それともプログラマが排他処理をするべきですか?
0268デフォルトの名無しさん
NGNGWin32と仮定するが、オブジェクトによっては、それを作成した
スレッド以外のスレッドからのアクセスを禁止しているものがある。
通常は明示されているが、それぞれについて調べるしかない。
記述がない、確証がない、バグの原因になりそうならば、
排他するしかないだろう。
0269267
NGNGWin32です。
質問が下手だったです…
えと、メインスレッドではWM_PAINTに応答を
しています。
ワーカースレッドで計算処理をしています。
この計算処理をすぐに表示したいときに
どうしようかなと…
ワーカースレッドでGetDC()をしようと思った時に
メインスレッドがWM_PAINTに応答しているかどうか
チェックするべきなのでしょうか?
私の勝手な予想だと、BeginPaint()がロックしているので
GetDC()が少しの間待機していて、EndPaint()が終了したら
GetDC()の待機が解けてGetDC()が成功するのでは…と
思っています。
ワーカースレッドが複数あったら、GetDC()の
取り合いが起きそうだけど…あっていますでしょうか?
0270デフォルトの名無しさん
NGNG調べてからにしてくれ。
0272デフォルトの名無しさん
NGNG0273デフォルトの名無しさん
NGNG> チェックするべきなのでしょうか?
応答してないような時にはきっと、描画なんかしてちゃいかんのだろうな。
0274デフォルトの名無しさん
NGNG取りあえず
http://msdn.microsoft.com/library/en-us/vcsample98/html/_sample_mfc_mtgdi.asp
辺りが参考になるかもね。
0275267
NGNG>To enhance performance, access to
>graphics device interface (GDI) objects
>(such as palettes, device contexts, regions, and the like)
>is not serialized.
もしやるとしたら、自分で排他処理をする必要があるのね…
おれ、BeginPaint()やGetDC()で得るデバイスコンテキスト(DC)って
GDIオブジェクトとは別だと思ってた
ペンとかブラシとかのグループとデバイスコンテキストのグループと
>ワーカースレッドで表示まで一緒にやらせようってのがそもそも
MsgWaitFor系の関数でメインスレッドで処理をするのでしょうか?
だったら自分の質問Tってかなり変だったのかな…
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNG> >ワーカースレッドで表示まで一緒にやらせようってのがそもそも
の続きは
「マルチスレッドにする意味がない。」
> MsgWaitFor系の関数でメインスレッドで処理をするのでしょうか?
> だったら自分の質問Tってかなり変だったのかな…
メインスレッドとワーカースレッドでどういう情報をどの程度やりとりするか
によると思うが。ワーカーからなにか能動的にメインに投げる必要があるなら
イベントループに組み込むだろうし、そうでなくて単に途中経過を脇から取り
出すだけなら(CriticalSectionで保護して)変数を共有するだけで済むかも知
れないし。
0278デフォルトの名無しさん
NGNG0279デフォルトの名無しさん
NGNG0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNG>error C2664: '_beginthread' : 1 番目の引数を 'void (void *)' から 'void (__cdecl *)(void *)' に変換できません。 (新しい機能 ; ヘルプを参照)
> スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
>
vc6でこのようなエラーが出ました。
で、関数なのですが、テンプレートなのです。
template < typename TYPE > void __cdecl Thread( void* p ){}
main()
{
::_beginthread( Thread< bool, bool >, 0, &thread );
}
テンプレートは使えないのでしょうか?
0282デフォルトの名無しさん
NGNG0283デフォルトの名無しさん
NGNG高速化しようと思い、2つのスレッドで半分ずつ初期化しようとしています。
しかし、成功するときも多いのですが、5回に1度くらい、WaitForSingleObject()で
スレッドの終了を確認できず固まってしまいます。
どこが悪いかご教授いただけないでしょうか?
Windows2000 Pro, Athlon MP 1900+ * 2 の環境です。
0284283
NGNGint bmp_table_smp_size; // 個々のサイズ
void *BmpTableInitSMP(void *id) {
memset(bmp_table_smp[(int)id],0,bmp_table_smp_size);
return 0;
}
void BmpTableClear(void)
{
HANDLE pt[4]; // スレッドのハンドル
int size,max_thread = 2;
size = BMP_TABLE_SIZE*sizeof(BMP_TABLE);
bmp_table = (BMP_TABLE*)malloc( size );
bmp_table_smp_size = size / max_thread;
if ( bmp_table_smp_size * max_thread != size ) { printf("Size is odd!\n"); exit(0); }
for (i=0;i<max_thread;i++) {
bmp_table_smp[i] = (char*)bmp_table + bmp_table_smp_size*i;
}
for (i=0;i<max_thread;i++) {
pt[i] = (HANDLE)_beginthread( (void(__cdecl *)(void *))BmpTableInitSMP,0,(void *)i);
}
for (i=0;i<max_thread;i++) {
WaitForSingleObject(pt[i], INFINITE);
printf("pt[%d] thread end.\n",i);
}
}
0285デフォルトの名無しさん
NGNG分割したら遅くなると思うが、、、
いまどきはCPU2つ以上が基本なのか?
0286デフォルトの名無しさん
NGNG__cdecl void BmpTableInitSMP では。
0287283
NGNG1CPUだと256MBの初期化に0.50秒かかるのですが2CPUだと
0.43秒ぐらいになります。何度も呼ばれるので少しは効果が
あると思って。それにP4とかはHTがあるのでひょっとして
効果があるかも。
0288デフォルトの名無しさん
NGNG0289283
NGNGまったく固まらないようになりました。
お騒がせしました。
何が違うんだろ・・・?
0290デフォルトの名無しさん
NGNGどうなるか想像もできないのか
コードも汚いしスレッド以前の問題だ
0291283
NGNGMSDNに_beginthreadexを使え、と書いてあった。
> _beginthread が作成したスレッドの終了が早すぎると、_beginthread の呼び出し元に返されるハンドルが無効となる可能性や
0292デフォルトの名無しさん
NGNGMSDNくらいよく読め。
基本だろ。
0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNGバグではないのだが
0295デフォルトの名無しさん
NGNGこの場合、_beginthreadと_beginthreadexの動作の違いは何故?
0296デフォルトの名無しさん
NGNG勝手に CloseHandle() するんだろ。
0297デフォルトの名無しさん
NGNGMMXでも使ったほうがよくないか?
0298デフォルトの名無しさん
NGNGどうあがいてもバス速度がネックになるわけだし、
気にするだけ無駄だって。
0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNGcppllのログかどこかで読んだだけでしかとは覚えてないのだけど、
VC6はそういうテンプレートを正しく処理できないそうだ。
template < typename TYPE > void __cdecl Thread( void* p, TYPE dummy){}
とかいう風にダミーの引数を持たせて回避するんだったかな???
でもこの場合にそんなことしたらますます駄目だし…、
そうだ!こうやっておいてキャストすればうまくいったりしない?
template < typename TYPE > void __cdecl Thread(TYPE* p){}
0302デフォルトの名無しさん
NGNGベンチ取ってから物言え
0303デフォルトの名無しさん
NGNGそういうウザいネタはアセンブラスレでやってね。
0304デフォルトの名無しさん
NGNG0305デフォルトの名無しさん
NGNGそういうウザいネタはハァ?スレでやってね。
0306デフォルトの名無しさん
NGNGそうですか
0307デフォルトの名無しさん
NGNG0308デフォルトの名無しさん
NGNG0309名無しさん@XEmacs
NGNGCPU特化memset, loop unrolling, word/cache alignmentが王道で、スレ違いだわな。
freeの速いmemsetたくさん転がってるよ。sizeも固定みたいだから選択肢たくさんあるよ。
0310デフォルトの名無しさん
NGNG言って取り合いもしないのは甘ちゃんだな、てめーら。
0311デフォルトの名無しさん
NGNG283でてこーい。
速くなったとして、どういう理由なのかはちょっとだけ知りたいかも。
ただ、キャッシュ込みのバス調停は、アーキテクチャに依存しまくりなので
一般的な結論を得ることは難しいかも。
0312デフォルトの名無しさん
NGNGmemset するのは効率的でないと思う。
別のアプローチとして、MMX を使ったら memset の 114.6% の速度になった。
(Athlon XP + DDR-SDRAM)
0313デフォルトの名無しさん
NGNG最近のCPUにはキャッシュ制御系の命令もあるから、キャッシュ汚染の問題は
回避できるかと。(そうしたところで速いかは知らんが)
0314デフォルトの名無しさん
NGNG2CPUで速くなる理由としては、マルチタスクOSでは他のタスクを実行する時間もあるわけだし、1CPUではメモリバスの書込みサイクルをフルに使っていないんだと思う。
P4-HTはパイプラインと実行ユニットにアイドルが発生するプログラムどうしを並列して食わせるから速くなるわけで、0fillだと速くならないと思われ。
キャッシュも汚染するし。
0315デフォルトの名無しさん
NGNGcacheのentryの奪い合いが始っちゃうと思われ
0316デフォルトの名無しさん
NGNG{
if (handle_ && WaitForSingleObject(handle_, 0) == WAIT_TIMEOUT) {
// Error: 前のスレッドがまだアクティブ
return false;
}
if (handle_) {
// 前のスレッドは終了しているのでハンドルを閉じる
CloseHandle(handle_);
}
// 新しいスレッドを生成する
handle_ = (HANDLE) _beginthreadex(.....);
return handle_ == NULL ? false : true;
}
このようにして、最初の begin() 呼出しで立ち上がったスレッドが
アクティブである間は、2度目以降の begin() の呼出しをブロック
したいと考えています。
そこでなんですが 2度目の begin() 呼出しの時点で最初のスレッドが
まだ生成されておらず結果 WaitForSingleObject が WAIT_TIMEOUT
以外の値を返す可能性はあるでしょうか。
0317デフォルトの名無しさん
NGNG排他をちゃんとやらんといかんような・・・
そこから考えてみるといいかもよ
0318デフォルトの名無しさん
NGNGrace conditionではありうるかもね。
0319デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNGないよ。
ハンドルが得られた時点で、タイムスライスが割り当てられているか
否かはともかく、スレッドは生成されていて、waitable になってるから。
ただし排他は必要。
0321316
NGNG皆さんありがとうございます。handle_ は
class Thread {
HANDLE handle_;
となっていてコンストラクタで NULL に初期化されます。書き忘れ
失礼致しました。
_beginthreadex() が成功した時点でそれが保証されるんですね。
うまく行くということだと助かります。必要な排他処理というのは
begin() の入口と出口のことですよね。
0322デフォルトの名無しさん
NGNG(1)スレッドが終了したらスレッドのハンドルを閉じる
(2)前のスレッドのハンドルが有効なら次のスレッドを開始しない
0323デフォルトの名無しさん
NGNGbegin()を呼んでいるスレッドが複数あったりすると、それでは問題あるね。
まぁ、そんな実装しないと思うけど。
0324山崎渉
NGNG0325山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0326デフォルトの名無しさん
NGNG0327デフォルトの名無しさん
NGNG0328デフォルトの名無しさん
NGNGpthread_createと、pthread_joinくらいしか使っていない
プログラムを作っているのですが、
RedHat9.0でcompileすると実行時にcoreを吐いてしまう、ないし挙動不審です。
#RedHat8.0とかその以外のdistribution(Debianとか)では大体機能します。
うまくいく環境 (redhat 8.0)
gcc 3.2, glibc-2.2.93-5
マズーな環境(redhat 9.0)
gcc 3.2.2, glibc-2.3.2-11.9
プログラムには、
C++をベースにしていて、socketにはselectシステムコール使用してます。
#きちんとスレッドセーフを確認していないので、buggyだとは思います。
どこかクリティカルに問題が起こしているか、見当をつけたいわけです。
アドバイスをお願いします。ぜひに……
0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNG状況もわからんのにどんなアドバイスを期待してんだか...。
とりあえず、スレッド間で共有しているリソースを洗い出すことからはじめたらどうよ。
あと、core がでてんなら、直接的な原因はわかるだろうからそこから逆に追っていけばいいんでは ?
0331328
NGNGselect併用すると駄目っすか?
#selectを使わずに
#network受信待ちを解除する(timeoutさせる)代替手段ってどんなのあります?
>330
>とりあえず、スレッド間で共有しているリソースを洗い出すことからはじめたらどうよ。
ループを続行するか否かのbool変数くらいしかないのですが、
そんなもんでもリソース食い合うとマズいのでしょうか?
>あと、core がでてんなら、直接的な原因はわかるだろうからそこから逆に追っていけばいいんでは ?
libc6絡みでcore dumpしたというメッセージが表示された記憶がありますが、
ちょっと詳しいこと分からないです。
RedHat9.0からNPTLが採用されているので、それ絡みかな、とか思ってました。
(それ以前のバージョンは問題なく動いていたので)
0332デフォルトの名無しさん
NGNG> #selectを使わずに
> #network受信待ちを解除する(timeoutさせる)代替手段ってどんなのあります?
read()をSIGNALで止めるってのはできなかったっけ。EINTRで戻って来ないか?
> >あと、core がでてんなら、直接的な原因はわかるだろうからそこから逆に追っていけばいいんでは ?
> libc6絡みでcore dumpしたというメッセージが表示された記憶がありますが、
> ちょっと詳しいこと分からないです。
詳しいことはcore(とgdb)に聞け。
0333デフォルトの名無しさん
NGNG> libc6絡みでcore dumpしたというメッセージが表示された記憶がありますが、
> ちょっと詳しいこと分からないです。
正直そんな事でマルチスレッドのデバッグができるとは思えない。
悪いけど、ネタと見なして以下スルーするよ。
0334デフォルトの名無しさん
NGNGレスありがとうございます。(ほんま素人ですんません)
とりあえず、問題となっている部分が特定したのですが……
(signal 11 で segmentation fault起こしてました)
プログラムループの周波数を調整するのに、
signal, setitimer, sigpause 等を使っていたのが原因でした。
10ミリ秒単位でスリープかけるために、signalを使用していたのですが、
何とかpthreadとうまく共存させる方法、
もしくは目的と達成する代替手段はないものでしょうか?
この辺、きちんと理解・解決するための、
何か良い資料等ございましたらお教えいただけないでしょうか?
0335bloom
NGNG0336デフォルトの名無しさん
NGNG0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNG> signal, setitimer, sigpause 等を使っていたのが原因でした。
自分のプログラミングのせいじゃないと主張なさるわけか?
0339デフォルトの名無しさん
NGNG> 何とかpthreadとうまく共存させる方法、
仕様に従ってきちんと使う。
0340334
NGNGusleepを使った場合の精度が気に入らなくて、
強引にsignalを使っていたのですが、
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/nanosleep.2.html
>nanosleep はより高い精度の停止も可能である。
>もしプロセスが SCHED_FIFO や SCHED_RR のようなリアル・タイム方針の元でス
>ケジュールされているならば、 2 ms 以下の停止ができ、
nanosleepは、2ms以下で制御できるのですね。知りませんでした。
試してみます。ありがとうございました。
>338-339
>signal, setitimer, sigpause 等を使っていた*自分の不勉強*が原因でした。
と字間を補足しますよ。POSIX準拠ちゃんと調べます。
正直、だいぶ昔に作ったパーツの使い回しだったので
この辺の問題、すっかり忘れてました。
0341デフォルトの名無しさん
NGNG> POSIX準拠ちゃんと調べます。
IBMのNGPT取り込んだkernelじゃないとPOSIX準拠にはならないけど、
http://www-124.ibm.com/pthreads/
たぶんどっちでも変わらん。
0342デフォルトの名無しさん
NGNGPOSIX 1003.1
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
0343デフォルトの名無しさん
NGNG0344デフォルトの名無しさん
NGNGその場合timeBeginPeriodを
そのスレッド数分やるべきでしょうか?
それともどれかのスレッドで一回だけやれば十分?
0345デフォルトの名無しさん
NGNG一応、一回で十分。
timeBeginPeriod() はスレッドをまたいでも有効。
それどころか、プロセスをまたいでも有効。
0346デフォルトの名無しさん
NGNG何やるのかしんないけど、この辺は極めて怪しげ仕様なので、MSDNを熟読のこと。
0347デフォルトの名無しさん
NGNGtimeBeginPeriodでぐぐるとサイトによって相反することが書いてたりするし
0348デフォルトの名無しさん
NGNGマルチスレッドだろうがなんだろうがtimeBeginPeriodを使ったら
それに対応するtimeEndPeriodを呼ばなければならない。
一回最初にやって複数スレッドで使いまわすなら、
すべてのスレッドが終わった後で最後にtimeEndPeriodを一回呼べばよい。
なんか実験してるサイトもあるが、みた感じ日本語のサイトはどれも
場当たり的で参考にならない。ゲーム系のプログラマってみんな
あんな感じなのか?
0349デフォルトの名無しさん
NGNGどの本がオススメでしょうか?
私のレベルは、ようやくスレ立てと削除依頼が出せるようになった程度で
ageとsageをうまく使いこなせません。
現在使用している書籍は、Pthreadsプログラミング
ttp://www.amazon.co.jp/exec/obidos/ASIN/4900900664/ref=pd_bxgy_text_2/249-7564093-3835560
で、勉強したい内容は、
(銀行のシステムのように)ロックをかけて厳密な制御を施すよりは、
むしろ、負荷に応じてスレッドの優先順位をうまく調整するあたりなので、
もう一冊購入しようと考えています。
辞書的に使える本、ビギナーに優しい本なども紹介していただけると幸いです。
あと、この本は地雷だぞ、という情報についても……
0350デフォルトの名無しさん
NGNG> UNIXのマルチスレッドプログラミングの勉強をしようと思うのですが、
> 私のレベルは、ようやくスレ立てと削除依頼が出せるようになった程度で
> ageとsageをうまく使いこなせません。
ネタと言うことで良いか ?
0351デフォルトの名無しさん
NGNGUNIXでそれやるのはキツいような気がするナー
OS側の制約に翻弄されそうな予感。
0352デフォルトの名無しさん
NGNGよく理解した上でないとだめな場合もあるから、よく注意してやるがよい
0353349
NGNGネタ調で書きすぎました。すんません。真面目な質問なのです。
>351-352
まったく仰るとおりで、えーと、とりあえず、基本を押さえながら
最近の動向も探っていこうという方針です。
>> 負荷に応じてスレッドの優先順位をうまく調整する
この内容に限定しなくてもよいですから、
とりあえず、この本は使えた、使えないとか、いろいろお聞きかせください。
技術本は高いので、厳選しようかと……
以下は、リストアップしている本です。
・Pスレッドプログラミング
・実践マルチスレッドプログラミング
・Win32/C++ マルチスレッドプログラミング詳説
・マルチスレッドプログラミング入門
・POSIXスレッドプログラミング
・ATLプログラミング―C++テンプレートによるスレッドセーフなコンポーネント開発
0354デフォルトの名無しさん
NGNGPOSIXスレッドプログラミング: 自分はこれをスレッド入門とした。
自分自身は計算の並列化に使ってるだけなんで、
負荷に応じて優先順位を…なんて面倒くさそうなことは考えたこともありません。
0355デフォルトの名無しさん
NGNG昔はwww.sun.comにいい解説があったんだが、
今は全部セミナーになってしまったな。消すことないと思うんだが…
0356デフォルトの名無しさん
NGNG>354
うわー、よくスレッド直書きで並列のコーディングできるね。
わたしゃ、並列するときは、MPIが使うのがせいぜいです。
厳密な負荷分散に考慮するような処理までは必要ないけど、例えば、
・タスクA: 2000Hzで処理を実行
・タスクB: 500Hzで処理を実行
を並行に流しても、処理の優先度がうまく調整できない……
数十Hzだと大した問題ではないけど、
数千Hzの重い処理だとつらい。この辺、うまく解決したい。
実は、あんまし小難しいことを考えずに、
金で解決する(マルチプロセッサにする)のが正解だったりして。
0357デフォルトの名無しさん
NGNG0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNGほぼ非同期のスレッドが二つ並んでいて、
二つのCPUにそれぞれスレッドを割り当て
(つまり事実上、タスクスイッチしない)でも、
無理かな?
スレッドの優先順位を(root権限で)強制的に上げてやると、
ttp://kumagai.homeip.net/masaaki/research/library/linux/tips.html#setscheduler
10ms以下の制御が可能らしく、実際に試してそれを確認したのだが、
CPU一個だと他のタスクが完全に凍る。
でも、このホームページ曰く、マルチプロセッサだと
(ヲレは環境がなくて試せないが)他のタスクも機能してくれるらしい。
0360デフォルトの名無しさん
NGNGPentium3に比べて異様に重い気がするのだが、
これって私の勘違い? それとも周知の事実?
プログラム実行時の体感でなんとなくそう感じる。
ベンチとったわけではないから、はっきりしたことは言えないのだが……。
ちなみにOSはRedHat。
0361デフォルトの名無しさん
NGNGム板なんだし、ベンチとってみては?協力するよ。
そして衆知の事実にしようぜ。
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNGリアルタイムOSじゃないんだから、スレッドの優先度は上げられても
2000Hzとか500Hzをキッチリ守るのは無理だと思う。
実行時間の比率を4:1にするのすら難しいんじゃないかなあ。
0364デフォルトの名無しさん
NGNG有り余るCPUパワーで
禁断のソフトウェアループをかませば可能なのだけど、
論外だなあ……とか思いつつ。
>実行時間の比率を4:1にするのすら難しいんじゃないかなあ。
(スレッド毎に)gettimeofdayで時間を計りながらnanosleepで時間を調整しつつ……
ってアホでつかヲレは……。
なんかこの辺の、冴えたやり方はないものかなあ。
0365デフォルトの名無しさん
NGNG0366デフォルトの名無しさん
NGNG0367デフォルトの名無しさん
NGNG>実行時間の比率を4:1にするのすら難しいんじゃないかなあ。
は簡単。
0368デフォルトの名無しさん
NGNG0369デフォルトの名無しさん
NGNG>2000Hzの処理の後、4回に1回500Hzの処理を入れたらいけないのか?
ロックかけるってこと?
レスポンスが落ちるのがちょっと心配かなあ。
仮に優先課題を
(1)レスポンスタイム
(2)タスクのバランス
2000回処理した後にまとめて500回処理するのではなく、
4:1のバランスを維持する。
と想定すると、やっぱり残された選択肢はリアルタイムOS?
0370デフォルトの名無しさん
NGNGつか366が言いたいのは
2000Hz taskA
500Hz taskB
として、
A,A,A,A+B,A,A,A,A+B.....
でいいんじゃない?って事では。
0371デフォルトの名無しさん
NGNG0372デフォルトの名無しさん
NGNGCriticalSection と Event と WaitForMultipleObjects or WaitForSingleObject だけで
書くとどうなりますか? Semaphore とか使うと遅くないですかね?
0373デフォルトの名無しさん
NGNGどのみちEvent/WaitXXXObject使うなら変わらないと思うが。
0374369
NGNG>A,A,A,A+B,A,A,A,A+B.....
ちょっと書き方がまずかったみたい。
>>2000回処理した後にまとめて500回処理するのではなく、
>>4:1のバランスを維持する。
AとBをあくまで並列に処理させた場合に、
(マルチプロセッサか、Hyper-Threadingでもない限り
所詮は1CPUのタスクスイッチなのだけど)
なるべく4:1のバランスを維持するということを意図した。
1秒後のバランスが、トータルで4:1だとしても、
0.1秒で見て 10:1 とか一時的にふらついていたら嫌だなと。
WEBのサーバとかだとあんまし問題にならないだろうけど、
制御系だと結構重要ではないかと。
0375デフォルトの名無しさん
NGNG0376デフォルトの名無しさん
NGNG0377デフォルトの名無しさん
NGNG時分割で処理を進めればいい
0378デフォルトの名無しさん
NGNG0379デフォルトの名無しさん
NGNGコーディングもデバッグも大変になるし。
0380デフォルトの名無しさん
NGNG同時に使用することになっても問題ないですかね?
問題になるならクリティカルしようと思ってますが
0381デフォルトの名無しさん
NGNGdispatcherがよろしくやってくれるはず。
でないとFPUも安全じゃない。
0382デフォルトの名無しさん
NGNGFPUのレジスタはスレッドのスイッチの際、
切り替えが行われません。
スイッチ後初めて浮動小数点命令を使ったときに、
例外が発生し、レジスタの切り替えを行います。
MMXも同じようなことをしてるんじゃないかと思います。
詳しくはIA32のマニュアルを読むとよいです。
ただOSによっては方針が違うかもしれません。
少なくともWindowsはスイッチの際の切り替えは
やっていなかったと思います。
0383デフォルトの名無しさん
NGNG結城さんの本もかなりうまく書けているらしいですけど、なかなか敷居が高そうで、、、
一部の人に任せてしまって、問題なしですか?
0384デフォルトの名無しさん
NGNGなることのほうが多いのでよく理解したうえで、適切な場所に使う必要があります。
スレッドの実装そのものは別に難しいものではないので、
勉強しておいてもいいんでないかな。
と思ったけど
>一部の人に任せてしまって、問題なしですか?
その根性に問題あり。
プログラマとしての適正なさそうだからやめていいよ。
0385デフォルトの名無しさん
NGNG最近これ多いな。同じ人?
0386デフォルトの名無しさん
NGNGさぞかし優秀な部下がたくさんいらっしゃるんでしょうね。
0387デフォルトの名無しさん
NGNG384ではないが、俺も似たようなことを思った。
0388デフォルトの名無しさん
NGNG0389デフォルトの名無しさん
NGNG最低限人間として平均的な能力があればよく、適性もいらない。
ただし平均的なレベルから大きく劣る奴は何をやっても駄目なので、
当然プログラムも満足に作れない。
問題なのはプログラマとしての適性なのではなく、
あらゆる作業における基本能力が欠けていること。
0390デフォルトの名無しさん
NGNG自分で書いた方が10000倍ましだ。
若手教育にはまず「マルチスレッドプログラミングではまらせる」ことが大事。
スレッドかじった奴にHTやMPマシンでコード書かせてみー。泣きついてくること
受け合い。
0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG残業代が出たからいいものの。。。。。
0393デフォルトの名無しさん
NGNGSUNのワークベンチだかなんだかのIDEを素直に使ったほうがデバッグの効率はよさげだ。
Linux+pthreadでサーバ書いてしまいました。デバッグだるくて鬱。
0394デフォルトの名無しさん
NGNGやっぱPOSIXスレッドなのですか?
そもそもpthreadなんて使わないのだろうか・・
LinuxはNPTLやらなんやら色々出てきてもうだめぽ・・
0395デフォルトの名無しさん
NGNGWindowsの ::beginthreadex() もかなりだめぽと思うのですが。
0396デフォルトの名無しさん
NGNGsolarisのがpthreadの元になってる。ほぼ同じと思っていい。
pthreadに無いので有名なのはスレッドの強制停止かな。
まあこれはsolarisのが変なのかもしれない。
他のunixにもあるんだが、
いかんせんマイナーなので中身はよくわからん。
0397デフォルトの名無しさん
NGNGIDEとpthreadは両立します。
UNIXのスレッド開発環境の問題は、frameworkがないplatformが多いことと、
あってもvendor固有なことです。(e.g. DECthread)
>>394
pthreadは仕様であって、実装ではありません。NPTLはpthreadの一実装です。
ただし、いわゆるPC-UNIXには完全準拠の実装が少ないという問題はあります。
>>396
スレッドの強制停止がないのは、
最低限の設計が行なわれているAPIであることの証左です。
「Javaスレッドプログラミング」
http://www.amazon.com/exec/obidos/ASIN/0201310090/103-8053412-8027047
に解説があります。大規模かつミッションクリティカルなスレッドプログラミングにおいて、
スレッドの強制停止に頼るようなプログラマはチンカスです。
なお、realtime extensionがあれば、
signalを使った非同期処理をthreadごとに用いることができます。
乱筆ご容赦。
0398デフォルトの名無しさん
NGNG今の実装だと、どのスレッドがシグナル食らったか容易には判らんとかきいた。
0399デフォルトの名無しさん
NGNG逆です。あなたの言っているのはpthreadの仕様の方です。
linuxthreadはpthread規格に適合してません。
詳しくはhttp://pauillac.inria.fr/~xleroy/linuxthreadsで。
0400400
NGNG0401山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0402デフォルトの名無しさん
NGNG0403t-akiyama
NGNGこのPSPは、新規格UMD(ユニバーサルメディアディスク)というディスクを利用しており、そのサイズは直径6cmととても小さい(CDの半分程度)。 容量は1.8GBとなっている。
画面は4.5インチのTFT液晶で、480px x 272px(16:9)。MPEG4の再生やポリゴンも表示可能。外部端子として、USB2.0とメモリースティックコネクタが用意されているという。
この際、スク・エニもGBAからPSPに乗り換えたらどうでしょう。スク・エニの場合、PSPの方が実力を出しやすいような気がするんですが。
任天堂が携帯ゲーム機で圧倒的なシェアをもってるなら、スク・エニがそれを崩してみるのもおもしろいですし。かつて、PS人気の引き金となったFF7のように。
0404デフォルトの名無しさん
NGNG0405デフォルトの名無しさん
NGNG0406山崎 渉
NGNG0407山崎 渉
NGNG│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0408デフォルトの名無しさん
NGNG0409デフォルトの名無しさん
NGNGまずは自分で実験しる( ゚Д゚) とか言われそうですが、
コンパイラやOS依存とかだったらアレなので・・。
スレッドごとにスタックが完全に独立していれば何も問題ない"はず"
あるスレッドでthrowされた例外オブジェクトを別のスレッドで
参照するだとかそういうトンチンカンなことはしないよな?
0411デフォルトの名無しさん
NGNGtryを見つけるとリストの先頭にcatchを追加する。
例外が発生するとリストをたどりながら、どこでcatchするかを調べる。
例外はこのような実装になっている。
で、リストの先頭をどこかに保持しておかないとリストが作れない。
この先は調べてないんだけど、
スレッドのIDとかの情報を保持している領域に
そのリストの先頭を追加するとかしているんじゃないかと思う。
0412デフォルトの名無しさん
NGNG> コンパイラやOS依存
です。C++標準は何も言ってません。
コンパイラ、プラットフォームを限定すると情報得られやすいかも。
0413デフォルトの名無しさん
NGNGレスサンクスです。
>あるスレッドでthrowされた例外オブジェクトを別のスレッドで
>参照するだとかそういうトンチンカンなことはしないよな?
捕まえてあげないと、別スレッドまで飛んでくるんじゃないか?と
トンチンカンな事を考えてました・・。
コンパイラやOS依存となると
とりあえずは、あるスレッド内で発生した例外は
そのスレッド内で全て拾ってあげて
処理を完結するように心がけるのが得策かなぁ? (´・ω・`)
>コンパイラ、プラットフォームを限定すると情報得られやすいかも。
環境はVC++7.1がメインです。
0414デフォルトの名無しさん
NGNGUNIXのselectに相当する処理を行うには、どのような手順を踏むのが適当でしょう?
やりたいことは単純に、
一定時間(数秒ほど)データの受信がなければ、処理を中断するようにしたいわけです。
受信用スレッドを作成してループを回しているのですが、
(厳密な時刻テーブルでの中断処理は必要なく)とりあえず、プログラム終了の際、
このデータ受信待ちのスレッドをどうやって正常終了させるかの問題を解決したいです。
ご教授くださいませ。
---受信用スレッド内の該当箇所---
struct timeval timeout;
fd_set fd;
FD_ZERO( &fd ); FD_SET( recvfs, &fd );
timeout.tv_sec = 1; timeout.tv_usec = 0;
// 1秒待ってもデータが来なかったら処理をとばす。
switch( select( FD_SETSIZE, &fd, (fd_set *)0, (fd_set *)0, &timeout ) ){
case 0: break;
case -1: break;
default:
if( FD_ISSET( recvfs, &fd) ) socket.RecvData(); // 何らかのデータを受信する
break;
}
0415デフォルトの名無しさん
NGNG0416デフォルトの名無しさん
NGNGhttp://www.ops.dti.ne.jp/~allergy/socket/socket.html
0417414
NGNGありがとうございます。さっそく今からプログラムを組んでみます。
>>416
わかりやすく解説されていて、
少なくとも下調べの数時間分の労力が短縮されるかと。
サイトを作ってくれた方に感謝です。
0418デフォルトの名無しさん
NGNGlinux上で動くカワイイやつをさがしてます。
どなたか、おしえてください。
0419デフォルトの名無しさん
NGNGGDBで普通にサポートしてませんか?
で、自分の質問で悪いんだけど、マルチスレッドでオブザーバーパターンとか
多用してるとオブジェクト同士のロックがどうしてもデッドロック状態になって
しまうんですが、普通どのように回避するのでしょうか?
他のオブジェクトへのポインタを配列で持ちあって網の目状になっていて自分
のロックを確保してから相手のメソッド呼んで、その相手のメソッドの中でもロッ
ク確保して他のオブジェクト呼んで・・・とか繰り返しているとデッドロックは
避けられないと思うのですが。
0420デフォルトの名無しさん
NGNG0421デフォルトの名無しさん
NGNGUNIXで開発してる奴は普通まともなスレッドが実装されたOS使ってないから答えられない
0422デフォルトの名無しさん
NGNG0423418
NGNGどのスレッドがデッドロック状態にあるかどうかもわかんの?
0424デフォルトの名無しさん
NGNG多数のスレッドが、無作為に、直接Mutexかけて
相手の資源を参照しあうってのは、想像どおり
やっちゃいけないこと。
全くランダムにメッセージをやりとりしているのなら、
メッセージを送るという全ての状態で、1つの
共通な排他ロックを使わざるを得ない。
それだけでは効率悪いし、流れがわからんので、
普通は自前でメッセージマネージャを実装する。
スレッド作る前に並列性を抽出しておくって寸法な。
グループAとグループBは全く相関ないから、並列に
動かせるとか、最初に計画しておくわけよ。
0425デフォルトの名無しさん
NGNGって無理か
0426デフォルトの名無しさん
NGNG0427デフォルトの名無しさん
NGNG0428タイムアウトしたい人
NGNGとあるDLLがありまして、それの中の関数の実行時間が、
1000msec 〜 5000msec という時間ムラのある処理です。
これを 2000msec をしきい値としてタイムアウトしたいのですが、
どのようにすればいいでしょうか?
タイムアウト自体は、CreateThreadして、
WaitForSingleObjectの引数でどうにかなるとして、
いったん起動してしまったスレッドの実行を
明示停止するのは、どうすればいいのでしょうか。
(CloseHandleってシステムによるスレッド管理を止めるだけですよね??)
TerminateThreadはダメよ、
とMSDNに書いてあるので使う気があまりしません。
関数自体に、タイムアウトの引数を持たせるとか、
同期イベントをうけとる引数を持たせるとかしないと、
タイムアウトを実現する根本的な解決にならないのでしょうか?
(そのDLLはサードパーティのやつなんでバイナリしかない...)
0429426
NGNGサンプルプログラムとかほっしんですけど。
0430デフォルトの名無しさん
NGNGPlathomeは Windowsでいいのかな? (本文中から推察してる)
明示的に止めるなら、スレッドの引き数に
HANDLE abort = ::CreateEvent(0, FALSE, FALSE, 0);
とでもしたスレッド停止イベントでもつっこんでスレッドに渡してやって、
スレッド内部で、
HANDLE handles[] = { abort, (他なんかのハンドル)};
DWORD x = ::WaitForMultipleObjects(2, handles, FALSE, 2000);
switch (x) {
case WAIT_OBJECT_0: goto __abort;
case WAIT_OBJECT_0+1: ....
:
}
としといて、外から ::SetEvent(abort); じゃだめか?
ていうか、こういうこと知らないのか普通の香具師は?
こえーよ。おまいらスレッド使うの止めれ。
0431デフォルトの名無しさん
NGNGそれじゃあ無理でしょ
WaitFor〜で2秒間Waitしてる間何も仕事できないじゃん。
WAIT_OBJECT_0 + 1で仕事開始したらabort用のイベント見てないから終了できないし。
abortイベントを使うのはいいとして、仕事の間中、要所要所でTIMEOUTを0にして
監視するしかないんじゃない。単にbool変数でもいいんだが。
0432デフォルトの名無しさん
NGNG2秒以上時間がかかったスレッドは、そのまま実行させといて終わったら回収
でいいじゃん
0433デフォルトの名無しさん
NGNGそういう場合通信は無駄
生成したスレッド毎に時間計測させる
0434タイムアウトしたい人
NGNG430さんのご返事で主旨がおかしくなっちゃったんですけど、
これって、バイナリライブラリ内の関数で
ソースがないときの質問だったのですが...
やっぱりスレッドで実行される関数の内部に
手を入れられない場合にこういうことをするのはキビしいのですね。
普通のヤツはスレッド使うのやめれ、っていわれちゃった。(笑)
0435タイムアウトしたい人
NGNG0436デフォルトの名無しさん
NGNG>ソースがないときの質問だったのですが...
その関数に途中で正確に中断させる機能がないなら、タイムアウトは無理。
中断させなくても良くて、単に結果を無視して次の処理を実行すればいいなら、
>>432のやり方でしょう。
0437デフォルトの名無しさん
NGNG【プログラム中の全てのスレッドは、
常に同じ順序でロックを要求しなければならない】
という原則があるらしいのですが、具体的にどのような
手法をとればいいのかよくわかりません。
自前で、スレッド・ロック・マネージャみたいなのを
作るんでしょうか?
0438デフォルトの名無しさん
NGNG>>430は確かに変なレスしてるが、>>430に文句があるならはっきり書け。
自分もバイナリしかないと一言も書いてないんだから、非は君にもあるんじゃないか?
「あほっぽい」質問しといて、そういうひねくれたレスは、なんか醜いぞ。
0439デフォルトの名無しさん
NGNG>【プログラム中の全てのスレッドは、
>常に同じ順序でロックを要求しなければならない】
手法の前に何故同じ順序でロックしなければないらないか考えて見よう。
それが分かれば、どうすれば良いかが分かるでしょう。w
0440430
NGNGごめん、深読みして、スレッドを起こして監視するんだと思ってコード書いてたら
そのスレッド自体を止めるのかと考えがずれてしまった。
>>432
同意。
>>434
ほんとすまん。
スレッドまともに使えない癖にコード書いている香具師(全く排他処理しないとか、
TerminateThread使うとか)多くてイライラしてたんでつ。そういうことをやられて、
尻拭いしてみると、俺も気持ちも分かってもらえるかと。
>>438
変で悪かったなw 擁護無用。
0441437
NGNG互いに必要な資源を確保したまま、相手の資源を確保しようとして、デッドロックって感じですよね?
つーことは、キューを使って、スレッド・ロック・マネージャみたいなのを実現すればいいのん?
0442デフォルトの名無しさん
NGNG例えばロックを発生させるメソッドコールA,B,Cがあったとして、
全てのスレッドがA->B->C(A->Bだけ、B->Cだけ、A->Cだけも可)
の順序でそれらのメソッドをコールするようにすれば、デッドロック
はおきません。
なるべくこのルールで回避して、どうしてもダメなとき、例えば
A->B、B->Aが発生する時だけ、「A->B」「B->A」の呼び出し全体を
排他処理すればオケ。
0443デフォルトの名無しさん
NGNGってどんなことをするのを考えてるのですか?
0444デフォルトの名無しさん
NGNGロックされてるリソースに対して優先順位をつけたいってことか?
0445441
NGNG>> 444
こんなこと。
まず始めに、X個のジョブをジョブキューに格納。
次にメインスレッドがワーカスレッドを10匹作成。
【1:MAIN 】全てのワーカスレッドが、クリーンアップキューに格納されるまで待機(※1)。
【2:MAIN 】※2で待機しているワーカスレッドを一斉起動。
【3:MAIN 】ワーカスレッドとメインスレッドをjoin。
【1:worker】ジョブキューにジョブが存在する間、各ワーカはジョブを処理する。
【2:worker】ジョブキューが空っぽになったら、ワーカスレッドはクリーンアップキューに入り、待機(※2)。
このとき、最後に格納されたワーカスレッドが※1で待機しているメインスレッドにシグナルを贈り
メインを起動させる。
メインスレッドが"【1:MAIN 】"のステップを踏む前に、
ワーカスレッドが"【2:worker】"のステップを踏んだ場合、
デッドロックになるよね?
今は、sleep()をワーカスレッドにつかって【1:MAIN 】→【2:worker】
ってなるようにしてるけど、ふつー、こんなアッフォなことしないだろうと。
いったい、どうすればいいのさ。
最近、スレッドプログラミング始めたばっかりの者なんで、
けっこう頭わるそうな、質問かもしれませんが、おおめに見てやってくださいな。
0446デフォルトの名無しさん
NGNGcondition variableでも使えば。
0447デフォルトの名無しさん
NGNGセマフォが使えるなら、
■main
スレッド生成&起動10個;
P() x 10個
■worker
V();
みたいな感じ。セマフォってpthreadとかで使えるのかよくしらんので、
たいていこんな感じで作るかな。
■main
int flag[10] = {0,0,0,0, . . . }; // 同期用フラグ
スレッド生成&起動10個;
while(1) {
for(i = 0; i < 10; i++ ) {
if( flag[ i ] == 0 ) break;
}
if( i == 10 ) break;
yield() または sleep(1)
}
以下略
■worker
flag[ thread_id ] = 1;
. . .
0448デフォルトの名無しさん
NGNGpthread_barrier_wait が使える環境なら、それを使えば一発。
0449デフォルトの名無しさん
NGNG0450デフォルトの名無しさん
NGNG0451デフォルトの名無しさん
NGNG0452デフォルトの名無しさん
NGNG.....
pthread_create(&t_id, NULL, func, (void *)arg);
.....
pthread_join(t_id, &status);
printf("status:%d\n", (int)status);
ってして、funcのなかで、
void *func(void *myArg){
return (void *)1;
}
ってしたら、
% status:1
って出力されるんだけど、これはなんで?
プログラムは正しく動くけど、よく理解できません。
statusってアドレスだと思うんですけど...
printf("status:%d\n", (int)*status);
ってやると、ワーニングでるし...
なんで?
0453デフォルトの名無しさん
NGNGマルチスレッド云々以前に、まずCの基本を勉強しよう。
0454デフォルトの名無しさん
NGNGここにいるのは役に立たないクズばかりですね。
もういいです。
0455デフォルトの名無しさん
NGNGクズはお前!他人になりすまして、勝手にレスすんな!!
最近、友達から無視されて辛いのはわかるが、それは、自分がわるいからでしょ?
素直になれよ...
453へ、ほんとにすんません。
googleとかで調べて、勉強したんですが、良くわかりません。
どなたか御教授くださいな。
0456デフォルトの名無しさん
NGNG>>453
0457デフォルトの名無しさん
NGNG単にキャストしてるだけだろ。
以降はこのへんへ。
C言語なら私に聞け! Part 66
http://pc2.2ch.net/test/read.cgi/tech/1066560665/
C言語の第一歩
http://pc2.2ch.net/test/read.cgi/tech/1031374980/
0458デフォルトの名無しさん
NGNGどの辺が使えないんでしょうか?
0459デフォルトの名無しさん
NGNGちみの書いていることって、
void *status;
status = (void*)1;
printf("status:%d\n", (int)status);
って書いているのと同等だということが分からんか。
期待通りの動作だと思うぞ? コードの意味は不明だが。
0460デフォルトの名無しさん
NGNG素直に読むと絶対アドレスの1番地(に設定したvoid型ポインタ)を返す
としか読めんが。組み込み以外でそんなコード書くことってあるのか?
0461デフォルトの名無しさん
NGNG>>457
0462デフォルトの名無しさん
NGNG複数スレッドがデストラクタを実行することってあるのでしょうか?
0463デフォルトの名無しさん
NGNGstaticなインスタンスってどゆこと?
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNGデストラクタを複数スレッドが実行することが
あるのかどうかが分かっていないのです。
0466デフォルトの名無しさん
NGNG0467デフォルトの名無しさん
NGNG0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNGあふぉか
0470デフォルトの名無しさん
NGNG>>457
0471デフォルトの名無しさん
NGNGスレッドを次々に所定の数まで作るのはどうすればいいのでしょう?
私が持っているBCBの入門本では、別スレッドを1個しか作っておらず、
複数のスレッドの管理までは説明されていません。
よろしくお願いします。
0472デフォルトの名無しさん
NGNG0473デフォルトの名無しさん
NGNG0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNG0476474
NGNG標準ライブラリからインクルードして利用する関数も全部そうするの?
そこまで,暇人じゃあねーんです.
どなたか,御教授くださいな.
0477デフォルトの名無しさん
NGNGWindowsならMSDN
Solarisならman
PC-UNIXはmanに明記してなければ、source読め、かのぉ〜
0478474
NGNGやっぱり,ソースを1つずつ読んでいくしかねーのかなー?
0479デフォルトの名無しさん
NGNG0480デフォルトの名無しさん
NGNGstdioはMT-Safe。glibcのmanual読んでね。
0481474
NGNGどこに格納されてんの?
アッフォなこと聞いて申し訳。
0482デフォルトの名無しさん
NGNG0483デフォルトの名無しさん
NGNGstrtokやtime.hの多くの関数群は、普通に実装すると非スレッドセーフになる
ような腐ったインタフェースを持っているが、今どきはステートをTLSに
突っ込むことで解決しているか、リエントラント版の別関数が用意されてるのが
普通。
stdioはステートフルだが、今どきはMTSafeにした版も用意されている。
が、これは排他によって実現されており、古典的な実装に比べて恐ろしく
非効率なので、通常は古典的な実装と合わせて2つの種類が用意されている。
こういう種類の非効率を解決するためにJava2で新しいコレクションフレーム
ワークが導入されたのは有名な話だな。
グレーゾーンでかつドキュメント化されてなければ、非スレッドセーフだと
考えた方が安全。しかし、状態を持つオブジェクトを複数スレッドから
触らなければ、通常は問題がない。
今どきスレッドセーフティに関する記述が一切なされていないような
ライブラリは、その信頼性を疑うべきだろう。
0484デフォルトの名無しさん
NGNG0485デフォルトの名無しさん
NGNGboost::threadのバグって具体的にどこらへん?
既にboost::thread使って作ったもんがあるから(業務用じゃないが)不安になってきた。
0486
NGNG0487デフォルトの名無しさん
NGNGなに?何語??スレッドをセーブするの??
みたいな感じです。はい。
よろしく。
0488デフォルトの名無しさん
NGNGthread save = スレッド保存
0489デフォルトの名無しさん
NGNG0490デフォルトの名無しさん
NGNGまともなスレッドが実装されているOS
されていないOS
の例を教えてください。
0491デフォルトの名無しさん
NGNG必死だな(w
0492デフォルトの名無しさん
NGNGまともなスレッドが実装されているOS ⇒ NT, Mach
されていないOS ⇒ Unix, Linux, *BSD
0493デフォルトの名無しさん
NGNG変数に対してクリティカルセクションとかで排他にするのは
書き込んでいる途中のオブジェクトを読み込むと変になってしまったりするからですよね。
ということはたとえば、終了フラグなどの単純な値は排他処理しなくてもいいのですか?
0494デフォルトの名無しさん
NGNG(゚Д゚)ハァ? って書いて欲しかったのか?
0495デフォルトの名無しさん
NGNG0496デフォルトの名無しさん
NGNG何か間違いでも?
0497デフォルトの名無しさん
NGNGCPU + busがatomicであると保証している操作は排他する必要がない。
例えばword境界にwordを書き込む、などはほとんどのarchitctureでatomic.
kernel threadについて言えば、
まともなスレッドが実装されているOS ⇒ NT, Mach, Solaris, AIX, HP-UX, Tru 64, Linux, VxWorks...
されつつあるOS ⇒ *BSD
変なAPIを持つOS ⇒ NT
pthreadに適合しないthreadを持つOS ⇒ Linux, *BSD
0498デフォルトの名無しさん
NGNG概ね賛成だけど、初心者に対しては少し極論ではないかと思う。
>CPU + busがatomicであると保証している操作は排他する必要がない。
>例えばword境界にwordを書き込む、などはほとんどのarchitctureでatomic.
書きこむ時は、どっかのメモリにの内容をレジスタに読み出して目的のメモリ
に書き出すのが一般的だから、1命令で終わるとは思えないし、その間に
dispatchが発生したらおかしなことになりかねないと思う。
>>493
制御系とかのクリティカルな場面では排他制御をするかしないかは、フラグ
の使われ方を考慮して慎重に検討したほうがいいよ。
Win の場合どうかわからないけど。。。
0499デフォルトの名無しさん
NGNGマルチスレッド界隈では有名なんですか?
0500デフォルトの名無しさん
NGNG回答ありがとうございます。
なるほど、CPUの命令がどうなってるかで対応が変わるわけですね。
スレッドの割り込ませ方がどうなっているかをまったく知らないのでなんですが、
割り込みが起こらないことが保障されているなら排他しなくてもよいと。
0501デフォルトの名無しさん
NGNGMkLinuxとか知らんのけ?
0502デフォルトの名無しさん
NGNG複数のクライアントからのTCP/IP接続をスレッドを作成して処理しているサーバーを作っています。
サーバー稼動中に、標準入力からコマンドを受け付けて各スレッドにそれを通知させる方法はありますか?
コマンドに応じて繋いでいるクライアントに一斉ファイル送信、などの処理を行ないたいのです。
言語はC、環境は赤帽9、pthreadを使っています。
ご指導お願いします。
0503デフォルトの名無しさん
NGNG頼むよ! そりゃ「読み出しと」書き込みだよ!
Mulit processorでアセンブラ書くなら、基本単位の読み出しあるいは書き込み「だけ」でも、
load-linkedとかstore-conditionalとか気にする必要あるけど、
>>493はVC++でWin32でしょ。
>>493
OSの本の排他制御を基礎から解説しているのを読んでみれ。
Deckerのアルゴリズムとか初歩的な概念から載ってる本な。一章分だけ読みゃ済むから。
岩波のシリーズのOSの分冊とか、タンネンバウムのOS本とかが手に入りやすい。
0504デフォルトの名無しさん
NGNG漏れはどっちかって言うとファーム屋で、過去に一度これでイタイ目にあったこ
とがあるんで、そんなこともあるよって注意を促しただけ。気に障ったらスマソ。
>>500
>スレッドの割り込ませ方がどうなっているかをまったく知らないのでなんですが、
漏れも知らんのだが、誰か知ってる人いたらおしえてください。
0505デフォルトの名無しさん
NGNGCPUの割り込みのレベルまで考えないと、
>>493の知りたいことは知ることができない。
ただ、Win32ということなので、intの書き込みはatomicと思っていい。
0506デフォルトの名無しさん
NGNG下位1WORD、上位1WORDと2回に分けて書きこまないといけなかった。
その間に割り込みが発生して別のルーチンが先に書きこんだ下位1WORD
を書き換えてしまうと、おかしくなる。
32ビットバスだと1回で書きこみできるんでそんなことは発生しない。
ってことだね。
0507デフォルトの名無しさん
NGNGInterlockedExchangeとか使っとけよ…。
0508デフォルトの名無しさん
NGNG0509デフォルトの名無しさん
NGNG環境で例外を吐いてしまうってバグなかったっけ?
0510デフォルトの名無しさん
NGNG0か1かみたいな単純なフラグならスレッドが途中で切り替わったところで問題ないと
思うが俺の理解間違ってる?
0511デフォルトの名無しさん
NGNGという答えでよろしいか? (って何様だ、俺…)
0512デフォルトの名無しさん
NGNGマルチスレッド界隈は知らんがOS界隈では有名だな。たぶん。
0513デフォルトの名無しさん
NGNG全ての環境でそれが保証されるわけでは無い
というのが答えでは。win32の32bit変数なら
多分OKだろうけど。
だからといって味噌糞にロックかけるのも
何なんで、atomic_flag見たいなクラスなり
関数なりを作って集中管理して、他環境に
移植する再にそれを修正するのが正しいと思う。
C/C++ならinlineがあるからそれが単純な関数だった
としても最適化されるだろうし。
0514デフォルトの名無しさん
NGNG0515デフォルトの名無しさん
NGNG0516デフォルトの名無しさん
NGNG書くだけ、読むだけならたぶんだいじょうぶ。
読んで書くなら排他制御必要だとおもったほうがいい
0517デフォルトの名無しさん
NGNG了解しますた。
今回は一方で終了フラグをたて、もう一方ではそれを読んで終了するだけなので
排他制御は要らないようです。
0518デフォルトの名無しさん
NGNG0519デフォルトの名無しさん
NGNG最初の1回目の実行時のみ「スレッド内」が呼ばれるだけで
2回目以降は表示されません。
どうしてでしょう?
unsigned __stdcall TestThread(void * param)
{
std::cout << "スレッド内" << std::endl;
return 0;
}
void main()
{
DWORD id = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, TestThread, NULL, 0, (unsigned *)&id);
std::cout << "スレッド呼ばれたかな?" << std::endl;
return ;
}
0520デフォルトの名無しさん
NGNG0521デフォルトの名無しさん
NGNG/*実行結果*/
スレッド内
スレッド呼ばれたかな?
にはならないんですかね?
1度目の実行時には表示されるけど、
2回目以降実行すると
/*実行結果*/
スレッド呼ばれたかな?
で終わってしまう。
0522デフォルトの名無しさん
NGNGデバッグでブレークポイントをいろいろ変えてみたら
「スレッド内」が表示するタイミングがズレてるのが原因みたいでした。
おっしゃる通り、メインが終了してるからでしたね。
ごめんなさい。
TestThreadが呼ばれて実行するタイミングは必ずしも
順番通りというわけじゃないのでしょうか。
0523デフォルトの名無しさん
NGNGその通り。スレッドが作成されたからってOSがどうスケジューリングするかで
実行されたりされなかったりするね。そのコードだと。
0524デフォルトの名無しさん
NGNG勉強になりました。
ありがとうございました。
0525デフォルトの名無しさん
NGNG実際に作ってみると、だいたい新しいスレッドってなかなか実行開始しないんだよねー
デバッガでブレークかけてると(無駄に時間がたつので)すぐに実行されるので
大丈夫だったのがブレークやめたとたんにエラーになるとかいうのがよくある。
なかなか手ごわいです
0526デフォルトの名無しさん
NGNG設計を考え直しませう。
0527デフォルトの名無しさん
NGNG0528デフォルトの名無しさん
NGNGこの場合はメインスレッドのどっかで WaitForSingleObject(hThread) かなんかで
ワーカスレッドがチャンと終了するのを待ってやる方が正しいと思うが。
0529デフォルトの名無しさん
NGNG0530デフォルトの名無しさん
NGNG>実際に作ってみると、だいたい新しいスレッドってなかなか実行開始しないんだよねー
スレッドの優先度が低くなってるんじゃない?
0531デフォルトの名無しさん
NGNGメインスレッドでビジーループしてると見た
0532デフォルトの名無しさん
NGNGそうすればこのレスは完全に無視していいことがわかる。
0533デフォルトの名無しさん
NGNGマジ素晴らしい。UNIXのスレッドスケジューリングを遥かに超えている。
0534デフォルトの名無しさん
NGNG0535デフォルトの名無しさん
NGNGマジ素晴らしい。UNIXのスレッドスケジューリングを遥かに超えている。
0536デフォルトの名無しさん
NGNG0537デフォルトの名無しさん
NGNG画面に出力する重い処理走らせると、一定時間タスク切り替えが
できなくなるよな。あれはスケジュールングの話題に関係あるのか?
0538デフォルトの名無しさん
NGNG0539デフォルトの名無しさん
NGNGこれもスケジューリングの話題に関係あるのか?
0540デフォルトの名無しさん
NGNGソースきぼんぬ
0541デフォルトの名無しさん
NGNGもしかしてようやく優先順位キューが?
0542デフォルトの名無しさん
NGNGPriority inheritance付きで?
0543デフォルトの名無しさん
NGNGshmget()やshmctl()を使って共有メモリを複数のプロセスから
同時にアクセスしたい。pthreadのmutex_lock()のように
相互排除ロックは必要なのでしょうか?
必要だとしたらどういう関数を使えばいいのですか?
0544デフォルトの名無しさん
NGNGSystem V IPCのshm*は、単なる共有メモリであって同期機構はないからね。
lockingは、同じくSystem V IPCのsem*(semaphore)を使ってね。
これがない頃は、open(2)のO_CREAT | O_EXCLを使ってましたねえ。
0545デフォルトの名無しさん
NGNGpthreadにおいてスレッドが動作しているかどうか調べるためにはどうしたらいいですか?
0546デフォルトの名無しさん
NGNGマルチは放置で。
0547デフォルトの名無しさん
NGNGマジレス希望。
0548デフォルトの名無しさん
NGNG0549デフォルトの名無しさん
NGNGどうして禿だとわかった!?
0550デフォルトの名無しさん
NGNGねーよ、pthreadにはな。
Javaのthreadにはあるけどな。
0551デフォルトの名無しさん
NGNGそのメソッド内でエラーをcatchし、呼び出し元にthrowしようとしたのですが
うまくいきません。
.net Frameworkのスレッド特有の現象なのでしょうか?
0552デフォルトの名無しさん
NGNG0553デフォルトの名無しさん
NGNGそうですか、ありがとうございます。
何かそれについて説明されているサイトなどあるでしょうか?
0554デフォルトの名無しさん
NGNG> うまくいきません。
はやめなさい。状況を説明しる
0555デフォルトの名無しさん
NGNGなんつーかマルチスレッドって必要性感じ無かったナ。
んじゃね。
0556デフォルトの名無しさん
NGNGご存知だと思いますが、
呼び出されているメソッド内で
try
・・・・・
catch ex as exception
throw ex
end try
とし、かつ、呼び出し元でtry,catchをしていれば
普通、ここでその例外をcatchできるんです。
でも、呼び出し元で
try
Dim t As New Thread(AddressOf 呼び出すメソッド名)
t.Start()
catch ex as exception
ex.tostring
end try
としても、呼び出されたメソッドで例外がスローされても
こちらに飛ばないんです。
0557デフォルトの名無しさん
NGNGご存知だと思いますが、
呼び出されているメソッド内で
try
・・・・・
catch ex as exception
throw ex
end try
とし、かつ、呼び出し元でtry,catchをしていれば
普通、ここでその例外をcatchできるんです。
でも、呼び出し元で
try
Dim t As New Thread(AddressOf 呼び出すメソッド名)
t.Start()
catch ex as exception
ex.tostring
end try
としても、呼び出されたメソッドで例外がスローされても
こちらに飛ばないんです。
0558556
NGNGお許しを。
0559557
NGNGしかも日本語が変です。
10行目
「普通、そこでこの例外をcatchできるんです。」
に訂正です。
最後の文もおかしいですね・・・
0560559
NGNG0561デフォルトの名無しさん
NGNG案の定。
理由は >>552 の通りで、新しいスレッド内でthrowされた例外は、
そのスレッド内でしかcatchできない。
557の後半のコードでcatchに来るとしたら、それはスレッドの生成に
失敗したときぐらいだろうね。
これが理解できないうちはスレッド使うのはやめといたほうがいい。
まあ、理解できたらできたでスレッドを使う気が失せると思うけど。
0563デフォルトの名無しさん
NGNGlinux 上で pthread を使ったプログラムをしてみたくて、
http://www-6.ibm.com/jp/developerworks/linux/001222/j_posix2-index.html
を見ながら試してたんだけど、その中の thread3.c が思った動作をしてくれません。
o..o..o.o..o..o.o.o.o.o..o..o..o.ooooooo のような結果を期待したのに、
....................oooooooooooooooooooo になってしまいます。
thread_function()中の sleep(1); を pthread_mutex_unlock(&mymutex); の下に
持って来ると期待した結果になります。
以上は、カーネル2.6 ですが、スケジューラの違いではとコメントがあったので
カーネル2.4 も試してみると、sleep の位置に関係なく期待どおりの動作でした。
カーネル2.6 での動作に違和感があるんだけど、なぜこんな動作になるんでしょう?
0564デフォルトの名無しさん
NGNGようになったんじゃなかったっけ。
SMPにすると2.6でも期待した結果になるかもよ。
0565デフォルトの名無しさん
NGNGどのようにスケジューリングされるかは完全にシステム依存だからなあ。
だから、どんなに違和感があろうとも、Linux2.6の挙動は仕様的にアリですな。
スケジューリング方法をもっと細かく操作したいのなら、
pthread_setschedparam()とかで明示的にscheduling policyなどを
指定するしかない。
でも、現在のLinuxでは PTHREAD_SCOPE_SYSTEM なスレッドしか作れないから、
厳密なスケジューリングを期待するのはやっぱり難しい。
ttp://www.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_08.html#tag_02_08_04
ttp://www.opengroup.org/onlinepubs/007904975/functions/xsh_chap02_09.html#tag_02_09_04_02
0566デフォルトの名無しさん
NGNGSMP は、試したいけどその環境がないです。
>>565
仕様ですか・・。黙るしかないですね・・。
素人考えでは lock の期間が長いと頻繁に例と同じような状況になって問題に
なりそうだけど、特殊な例だったのかな?
知識と経験の不足が明らかになったんで、こういうもん、ってことにして、もう
少しいろいろ使ってみます。
0567デフォルトの名無しさん
NGNGlockしてる期間の方がしてない期間よりも圧倒的に長いってのは、
割と特殊かもしれん。
どうしてもスイッチさせたいなら、unlockしたとこでpthread_yield()してみれば。
0568デフォルトの名無しさん
NGNGまあ、producer-consumerモデルだったら、同じスレッドが受け取ったほうが
キャッシュ効率がよさそうだねえ。
0569デフォルトの名無しさん
NGNG>mutexの奪い合いで適切にスイッチさせるのは無理があるような・・・
無理あるどころじゃないだろw
このプログラムで交互に出力されると思い込むほうがバグの元。
単純にmutex使っただけでは順序を規定させることはできないでしょ?
>>563
sleep()してようが、pthread_yield()してようが、
mutexで保証されるのはlock〜unlockまでのcritical sectionを
同時に実行できるスレッドは1つしかないってことだけ。
タイミングを揃えたいなら、condition variableを使うか、
フラグ見つつbusy loop(←sleep()やpthread_yield()使っても意味は一緒)
する必要がある(condition variableがそんな実装でも構わないのかも)。
スレッド間でタイミングを決定する同期を行ってない以上、
片方のスレッドが完了した後にもう一方が実行されてもおかしくはない。
その実装が腐ってるとは文句言えても、間違ってるとは言えない。
0570デフォルトの名無しさん
NGNG> その実装が腐ってるとは文句言えても、
ご存じの通り、これは言う奴が馬鹿でしょ。
0571デフォルトの名無しさん
NGNGこれ常識だよな。
0572デフォルトの名無しさん
NGNG0573デフォルトの名無しさん
NGNGんなアホな。
デッドロック一直線でんがな。
つか、pthread_mutex_lockの所で長時間待たされる可能性があるような実装は
ダサいと思う。
同期が必要ならpthread_cond_waitで待つようにすべきでしょ。
0574デフォルトの名無しさん
NGNG> んなアホな。
> デッドロック一直線でんがな。
???
0575デフォルトの名無しさん
NGNG"逆に便利すぎて怖い"&"互換性は?"ってことで敬遠してました。
積極的に使ってるって人っています?
0576デフォルトの名無しさん
NGNGというか使わずにどうやって…自前でやるよりもずっといいし。
0577デフォルトの名無しさん
NGNGそういう考え方は良くないんでない?
特に互換性は問題ないでしょ。今現在で一般的なスレッドAPIって
POSIX ThreadsとWin32くらいでどっちも十分似た仕様だし。
ただ、TLS(TSD)をスレッドセーフなグローバル変数としてガンガン
使うってのはちょっとまずそうな。。。
0578575
NGNG>スレッドローカルな作業域、属性などが必要な時に使ってます。
それだとそのまんまな様な。できれば具体例希望。
>>577
そうですね。結局グローバル変数的になっちゃうような気がします。
気になるのは、TLSを使う処理がスレッド構成に依存しちゃいそうな事。
処理優先度の変更等でスレッド構成を変えた時にどんな影響がでるのか
読めないのが怖いです。
0579デフォルトの名無しさん
NGNGクライアントごとにスレッドを割り振るサーバで、
パケットを生成するときの作業領域。sprintfしたり、checksum計算したり。
他にもクライアントごとに必要なデータをまとめて。
スレッドプール版は、pointer間接を一段増やして管理。
0580デフォルトの名無しさん
NGNG変数の更新があったらもうダメって訳ではないですよね。
0581デフォルトの名無しさん
NGNGchar * f(int i) {
static buf[BUFSIZ];
sprintf(buf, "%10d", i);
return buf;
}
gethostbyname(3)はこれに類するコードだったようで、
MT safeなgethostbyname_r(3)が新設された。
0582デフォルトの名無しさん
NGNGメモリ領域を特定して上書きする処理という事でしょうか。参照渡しの関数は
全滅なのかなぁ。
0583デフォルトの名無しさん
NGNG0584デフォルトの名無しさん
NGNGchar * f(int i, buf) {
sprintf(buf, "%10d", i);
return buf;
}
0585デフォルトの名無しさん
NGNGそういうのはマルチスレッドじゃなくても破綻するなぁ。
if ( strcmp( f(a), f(b) ) == 0 )
0586デフォルトの名無しさん
NGNG> gethostbyname(3)はこれに類するコードだったようで、
つーか、コード云々じゃなくて静的領域に値入れて返す奴は原理的に全滅だろ。
>>582
各スレッドで独立の領域を準備して参照渡しで処理してもらうなら問題ない。
(もちろん、内部でスレッドセーフなコーディングされていることが前提であるが。)
>>585
そのコーディングはマルチスレッド以前の話。
0587デフォルトの名無しさん
NGNGstatic char buf[BUFSIZ], *p;
sprintf(buf, "%10d", i);
p = malloc(strlen(buf)+1); // エラー処理はしょっとく
stycpy(buf, p);
return p;
}
でも、bufを排他してないから駄目。
0588デフォルトの名無しさん
NGNGboost::thread がデファクトスタンダードということで
いいのでしょうか?
0589デフォルトの名無しさん
NGNGまだ無理がないか?
それ以前にthreadに互換性を求めること自体が・・・
0590デフォルトの名無しさん
NGNG0591デフォルトの名無しさん
NGNG書くことって可能なの?
例えば pthread 自体は POSIX の下で動作が定義されているのかもしれないが、
C言語の規格はローカル変数はスタック領域に保存しなくてはいけないという
決まりは無かったと思う。
つまり pthread を使ったところで、ローカル変数を使用した関数が
スレッドセーフになるかどうかは処理系に依存してしまう訳だろ?
結局のところ、スレッドを使って処理系非依存のコードを書くことは
絶対に出来ないということになると思うのだが、そこのところどうよ
0592デフォルトの名無しさん
NGNG> つまり pthread を使ったところで、ローカル変数を使用した関数が
> スレッドセーフになるかどうかは処理系に依存してしまう訳だろ?
この環境では、(例えばshallow bindingなど)
スレッド政府な(ローカル変数を持つ)関数を書く事ができないので、
スレッドのポータビリティ検討対象から外してもいいのでは。
0593デフォルトの名無しさん
NGNG> gethostbyname(3)はこれに類するコードだったようで、
> MT safeなgethostbyname_r(3)が新設された。
gethostbyname(3)のアドレスファミリ独立版である(IPv4,v6どちらでも使える)
getaddrinfo(3)なら最初からスレッドセーフなので、
新しく書くプログラムならこっちを使ったほうがいいかも。
# もちろん対象のシステムにgetaddrinfo(3)があることが前提だが…
0594デフォルトの名無しさん
NGNG現実問題としてはその通りだろうけど・・・
基本的に処理系が保障していない動作を「見込んで」
プログラミングをするのって、何か怖くない?
0595デフォルトの名無しさん
NGNGあほですか?そんなことを気にすんならスレッドの方が桁違いに処理系依存だろ
そんなに気になるならK&R/ANSI C/C99の共通部分だけを厳密に使えば?
そしたら、コンソールやキーボードすら仮定できないよ?w
そもそも処理系が厳密に仕様を満たしてる保障もないわけだが。
0596デフォルトの名無しさん
NGNGプログラマが記述した関数が、>>591で言うような理由で、(ローカル関数がスタック上にない)
スレッドセイフにならないってことはありえないんじゃないの?
もしそうだったならば、APIがスレッドセイフである意味がないもんね。
もうちょっと現実的なしちゅえいしょんを描いてくれないと…
0597デフォルトの名無しさん
NGNG> C++で Linux / Win で互換性があるライブラリは
Cだったgthreadなんかどうなんだろね。
gimpのためにいろいろなプラットフォームに移植されているみたいだけども。
0598デフォルトの名無しさん
NGNGというか、POSIX 1003.1-2003ではgethostbynameはObsolescentとされているし、
gethostbyname_rはそもそもない。
ttp://www.opengroup.org/onlinepubs/007904975/functions/gethostbyaddr.html
0599デフォルトの名無しさん
NGNG>そんなことを気にすんならスレッドの方が桁違いに処理系依存だろ
これは、そういう意味での "処理系依存" という話ではない訳で・・・
コンソールやキーボードは、そのライブラリがあって、かつ言語の規格に
準拠したコードを書いてさえいれば、その規格を満たしたコンパイラなら
確実に意図した動作をするコードを吐いてくれる筈。
しかしこの場合、ライブラリがあって、規格準拠のコンパイラを使って、
どんなに行儀の良いコードを書いても、動く「保障」がない、
というのが気持ち悪い。
0600デフォルトの名無しさん
NGNG0601595
NGNGんじゃ、コンソールやキーボードの規格に準拠している、
コンパイラが確実に意図した動作をするコードを吐いてくれる、
ってのを保障してくれるのはどなた?
WindowsとUnix系じゃ全く同じように標準出力に書いても、
エスケープシーケンスとかの関係で見た目変わるよ?
動く保障がないと言うんなら、コンソールに出力しようとしたが、
メモリ不足でバッファを確保できなかったとかの場合もあるし。
#何でこんな奴相手にしてんだろ Σ(´�D`lll)
0602デフォルトの名無しさん
NGNGスレッド、ソケット、ファイルシステム
どれをとっても完全非依存は無理だよ
おいらは、アプリケーション作者が「必要な互換性」を選択できるように
なっているほうことが重要だと思うのよね。そういう意味では中途半端に
互換性を打ち出してるライブラリは、参考にはなれど、実用にはならん。
0603デフォルトの名無しさん
NGNG勿論、コンパイラ作者が「このコンパイラはローカル変数は
全てスタック領域(若しくはレジスタ)に貼り付けます」と
一言言ってくれて、プログラマが「このコードはそのような
処理系でのみ動作を保障します」と言いさえすれば全く問題がない。
ただ、現在の標準のCの規格だけでは、そうでもしない限り、
厳密に動作を保障することができないという事。
Cの規格が古いのがいけないのだろう。「Hosted環境」みたいに、
新たに「Threaded環境」というような概念を言語に組み込まないと
いけないような気がする。
0604デフォルトの名無しさん
NGNG0605デフォルトの名無しさん
NGNGお前が心配してるような実装が仮にあったとすると、再入性すら保証できないだろ。
つまり、autoをサポートしない処理系について心配してるわけだな。
続きはCOBOLスレかFORTRANスレでやってくれ。
0606デフォルトの名無しさん
NGNG女の子(処理)が来たら、触手(スレッド)がお出迎えさ。
いや、気にしないでくれ。
0607デフォルトの名無しさん
NGNG0608デフォルトの名無しさん
NGNG0609デフォルトの名無しさん
NGNG0610デフォルトの名無しさん
NGNG違うOSにマイグレートする事もある。
0611デフォルトの名無しさん
NGNG0612デフォルトの名無しさん
NGNG0613デフォルトの名無しさん
NGNGしてないとしたら、スレッドはどういうライフサイクルになってる?
AIX上でスレッドを実装するときに気をつけることは?
0614デフォルトの名無しさん
NGNGマニュアルを良く読む。
スケジューラの性質について勝手な空想をしない。
0615デフォルトの名無しさん
NGNG0616デフォルトの名無しさん
NGNG0617デフォルトの名無しさん
NGNGその挙動は環境に大きく依存する。
ちなみに pure java を名乗るためには、スケジューラの挙動に
依存してはならない。つまり、CPUを長時間占有するようなタスクは、
適宜 yield() を呼ばなければならない。
0618デフォルトの名無しさん
NGNG0619デフォルトの名無しさん
NGNG0620デフォルトの名無しさん
NGNGうわ、だっせー
0621デフォルトの名無しさん
NGNG普通じゃないか。
0622デフォルトの名無しさん
NGNG0623デフォルトの名無しさん
NGNG0624デフォルトの名無しさん
NGNGJavaの場合はそう決まっているわけではない。
実装によっては単にhintとして使ったり、無視して良い。
0625デフォルトの名無しさん
NGNG0626デフォルトの名無しさん
NGNG0627デフォルトの名無しさん
NGNGスレッドの実装はwin32からだえお
0628デフォルトの名無しさん
NGNGお前pure javaを勘違いしてない?
普通は(直接的に)ネイティブコードを使わずに実装されてる事だと思うが。
それにスケジューラが平等だとかには依存しない方がいいのは確かだが、
yield()しなきゃコンテキストスイッチが起こらない可能性は考慮する必要なし。
Javaの仕様的にはそんな糞実装でも間違ってはないんだろうが・・・
0629デフォルトの名無しさん
NGNGそれじゃpure javaになりません。
pure javaでないjavaコードに存在価値なんてありません。
0630デフォルトの名無しさん
NGNG>yield()しなきゃコンテキストスイッチが起こらない可能性は考慮する必要なし。
>
>Javaの仕様的にはそんな糞実装でも間違ってはないんだろうが・・・
そんな事言っている奴らばかりだから
Java 厨は、"Write Once, Run Away" って蔑まれるんだよ。
0631628
NGNG( ゚Д゚)ハァ?お前の言うpure javaの意味書いてみろよ
>>630
「yield()書かないとコンテキストスイッチしません」って
環境で作らなきゃならないんなら、必要に応じて組み込むが、
あるとしても一部の異常な実装だろ。
そもそもyield()しなきゃいけない状況の方が特殊だろ。
無駄にbusy loopしまくりなプログラムでも書くのか?
0632デフォルトの名無しさん
NGNG勝手に限定しないでくださいね。
0634デフォルトの名無しさん
NGNG実装系の話をされても困るんですがねぇ・・
0635デフォルトの名無しさん
NGNG>この規定はpure javaの規定であって、
>実装系の話をされても困るんですがねぇ・・
いや、もともと JAVA は環境というものについて
その程度の認識しか持たない(or 持てない)レベルの奴でも
必ず動くコードが書けるようになる、というのが設計理念だった筈。
だからこそ >>631 みたいな厨がわらわらと JAVA に群がってきた訳で。
これは JAVA 自体の設計ミスだな。
0636628
NGNG厨と言うなら、どこに問題があるのか正確に示してみろ
0637デフォルトの名無しさん
NGNG2.6ってスレッドに不具合が無かったですか?
昔に聞いた事があるような気がするのですが。。
教えて下さい。
0638デフォルトの名無しさん
NGNGgettimeofdayはスレッドセーフなのでしょうか?
教えて下さい。よろしくお願いします。
0639デフォルトの名無しさん
NGNGマジレス
0640デフォルトの名無しさん
NGNGPOSIX Threads for Win32
http://sources.redhat.com/pthreads-win32/
0641デフォルトの名無しさん
NGNGcygwin向け?
0642デフォルトの名無しさん
NGNG0643デフォルトの名無しさん
NGNG自分のソースの寿命が Win32 の寿命よりも長いと思っている香具師向け。
0644デフォルトの名無しさん
NGNG0645デフォルトの名無しさん
NGNGlinuxとwin32で同じソースコードが使えれば便利じゃない?
0646デフォルトの名無しさん
NGNGそのスレッド内で作成されたオブジェクトのデストラクタが呼ばれないのは、
仕様ですか?
class Hoge{
public:
Hoge( int n_ ):
n_ptr( new int(n_) ){
}
~Hoge(){
std::cout << "~Hoge" << std::endl;
}
boost::scoped_ptr<int> n_ptr;
};
beginthreadexで呼び出す
unsigned int __stdcall thread_test( void* data_ ){
Hoge hoge(100);
_endthreadex( 0 );
return 0;
}
デストラクタが呼ばれれない・・・、メモリリークしやがる・・・。どうすればいいですかね?
別なところからこのスレッド終了させる場合に_endthreadexつかえないのは不便・・・。
0647デフォルトの名無しさん
NGNG0648デフォルトの名無しさん
NGNG仕様っつーか、C++の想定範囲外。
exitでローカル変数のデストラクタ呼ばれるか?
きちんと廃棄させたいなら、例外投げるなり汁。
0650デフォルトの名無しさん
NGNGRedHat Linux9は大丈夫でしょうか?
0651デフォルトの名無しさん
NGNG0652デフォルトの名無しさん
NGNGBasilisk II という 68K Mac のエミュレータがあります。インストールして
起動すると、Mac の画面が出て、Mac らしい操作ができますが、winXP で他の
アプリケーションを起動して終えて元に戻ったとき、復帰しないことがあります。
win98 では、この現象が出ないように思えます。
エミュレーションは、ソースを見ると、起動後スレッドを次々に立てて、mutex
で管理しているようです。(出てくる画面にはタイトルバーがありますが、
メニューはありません。full screen 指定ならタイトルバーもありません。)
よくある API application に付く WinProc はありません。
質問は、mutex によるスレッド管理で、winXP になって、何か変わったことは
あるのでしょうか。因みに Basilisk II は、winXP には正式に対応していな
いふしがあります。
0653デフォルトの名無しさん
NGNGスラドって何?
Linuxスレッドの欠陥って有名な話じゃないんですか?
0654デフォルトの名無しさん
NGNG俺の知る限りはない。
つかあったら困る。
0655デフォルトの名無しさん
NGNGどのあたりだ?w
0656デフォルトの名無しさん
NGNG0658デフォルトの名無しさん
NGNG例えば、>>656が指してるあたりに書いてあるけど、
スレッド群がmutexの奪い合いでスイッチするような作りだと、
OSのバージョンによっては動作が変わるかもしれんよ。
XPになってからHT対応が入ってるし。
0659デフォルトの名無しさん
NGNGちょっと違うような・・・
SMPでスレッドをスケジューリングするとき、今までキャッシュを持ってたCPUに
そのスレッドが再び割り当てられるとは限らないって聞いたんだけど。
Solarisなんかだとキャッシュを考慮して割り当てするらしいんだけど。
よくわからなかったら無視してください。
0660デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNG別にcache coherenceに問題が出るわけでもなかろうが…
0663デフォルトの名無しさん
NGNG禿道w
0664652
NGNGぎくっ。また引き戻されそう。
スレッドに強くないところへ持って来て、他人の作ったものは余計分かりません。
ま、エミュレータで、ドライバを動かすところは、スレッド立ててブン投げれば
処理が楽になりそうですが、winXP 側の都合で Mac に例えば、UpdateWindow を
やらせるようには出来ませんから、変にはなるだろうと想像しています。
MASM があれば、再コンパイルして、記録を取って見たいところです。
0665デフォルトの名無しさん
NGNGどうしもしません。ただ知りたいだけです。
アルゴリズムの高速化のプログラム書こうとすると影響すると思うんですが・・・
自分で実験してたしかめてみます。
0666662
NGNGあ、そう。
じゃあ/usr/src/linux*/Documentation/sched-design.txt読みなよ。
後、sched_*(2)辺りのAPIも一通り。
あなたがどこかで読んだ
> Linuxのスレッドはスケジューリングあたりに欠陥がある
なんてのは、「〜は〜の局面で〜なので〜である」の
「〜である」だけ流布しているバカ話なので、
常に上で示したような原典に当たることをおすすめします。
それが出来ない人はprogrammerとしてはずっとタコのままなので。
それから、threadへのCPU割当て親密性のことはprocessor/thread affinityと言います。
googleする時はこの単語を使ってください。
固定の場合はhard processor affinityなんて言います。
0667デフォルトの名無しさん
NGNGアドバイスありがとうございます。
参考にします。
0668デフォルトの名無しさん
NGNGその通り、
Linuxは欠陥品です
RedHatでもなんでも同じです。
0669デフォルトの名無しさん
NGNGあるint型の変数xについて、スレッドT1は書き込みのみ
x = a;
スレッドT2は読み込みのみ
b = x;
このような場合は、xについてT1,T2を排他処理する必要が
あるのでしょうか?
いらないんじゃないかと思ったのですが…
それから、xがレジスタ1個では表現できないおおきさの
構造体の変数だったとしても(例えばintを4つ含む構造体)
やっぱりいらないのでしょうか?
0670デフォルトの名無しさん
NGNG0672デフォルトの名無しさん
NGNG> このような場合は、xについてT1,T2を排他処理する必要があるのでしょうか?
シングルプロセサなら排他不要。
マルチプロセサでもint型がバス幅以下でミスアライメントしてなければ排他不要。
> 構造体の変数だったとしても(例えばintを4つ含む構造体) やっぱりいらないのでしょうか?
その4個の int が1組で意味を持つ (例えば 128bit 整数値とか) なら排他は必要。
0673デフォルトの名無しさん
NGNGコレはウソ、というのが493あたりからで出てたぞ。
0674デフォルトの名無しさん
NGNG> コレはウソ、というのが493あたりからで出てたぞ。
>> 498 の
> 書きこむ時は、どっかのメモリにの内容をレジスタに読み出して目的のメモリに
> 書き出すのが一般的だから、1命令で終わるとは思えないし、その間に
> dispatch が発生したらおかしなことになりかねないと思う。
のことかな ?
>>498 が言う、「どっかのメモリ」と「目的のメモリ」が関連しているような場合は
当然排他が必要だけど、目的のメモリだけが共有されてるケースなら、「目的
のメモリに書き込むのは1命令で終わる」から、問題はないよ。
あと、i++ とかのケースは当然ダメだけど、>>669 は「スレッドT1は書き込みの
み」って言ってるから、これは該当しないしね。
0675デフォルトの名無しさん
NGNGi++をするスレッドが一つだけで、他は全部iを読み込むだけだったら
問題ないんじゃない?
0676デフォルトの名無しさん
NGNGそれは>>674の最後の段落の繰り返しじゃない…
0677デフォルトの名無しさん
NGNGそだね。
0678デフォルトの名無しさん
NGNG>> 書きこむ時は、どっかのメモリにの内容をレジスタに読み出して目的のメモリに
>> 書き出すのが一般的だから、1命令で終わるとは思えないし、その間に
>> dispatch が発生したらおかしなことになりかねないと思う。
>
>のことかな ?
ちがう。ちゃんとスレ全部読め。
0679単なる煽りかな ?
NGNG指摘したいなら、ちゃんとレス番書け。
0680デフォルトの名無しさん
NGNGdocs.sun.com見ると、とりあえずSolarisは問題ないみたいなこと書いてありますが。
0681デフォルトの名無しさん
NGNG$(GCC)/libstdc++-v3/testsuite/thread/pthread*.cc
ではテストしてないね。
0682デフォルトの名無しさん
NGNGローカル変数とかも全部覚えておかないといけないわけなんだよね。
普通どうやって実装されてるの?
スタックをスレッドの本数分確保して、スレッド切り替えのときに
スタックポインタも変えてるの?
ということは見方を変えれば、schemeとかの「継続」と一緒?
なら、マルチスレッドで待ち合わせとかをうまく使えば、
C(C++)で、継続みたいなことが実現できるの?
結局やりたいのは、関数呼び出しの外から内へのlongjumpみたいのなんだけど。
漏れ、かなり理解が甘いと思うので、全然見当違いなことを言ってるかも。
0683デフォルトの名無しさん
NGNG継続をマルチスレッドでやるのは効率が悪い。やろうと思えば出来る。
マルチスレッド環境を継続で実現するのは、Schemeなんかで良く行われる。
0684デフォルトの名無しさん
NGNG0685682
NGNGで、今やりたいことを具体的に書くと、
CAB圧縮ファイルの伸張ライブラリ(Microsoft CabSDK)を使ってるんだけど、
これって、メモリ上に展開できるのはいいんだけど、途中まで展開してその結果を逐次利用みたいなことができないみたい。
ちょっと省略してイメージ的に書くと、
FDICopy(char* cabfilename, void (*writefunc)(char* data, int size));
みたいな関数を呼ぶと、ある程度まとまった量が展開されるたびに、
展開が終了したdataとsizeを引数にして、writefuncで指定したコールバックが呼ばれる。
writefuncでユーザーがdataをファイルに書き出すなり、好きなとこにコピーするなりすればいい。
て感じの仕組みになってる。
で、問題なのは、ファイル全体を完全に展開し終わるまで、FDICopy()自体からはリターンしない。
なんで、結局メモリ上に展開しようとしたら、展開後のファイルの大きさのバッファを確保しておいて、
いったん完全にメモリいコピーするしかないみたい。
そうじゃなくて、zlibみたいにちょっとだけ展開してその結果を使ってなんかして、また展開みたいにしたい。
(かなり大きなファイルなので、全部メモリに展開するのは厳しい。)
んで、FDICopy()を別スレッドで動かして、writefuncが呼ばれるたびに、
スレッドを切り替えて、途中結果を利用して終わったら、
またFDICopy()に戻る、みたいなことってできるのかな、っと思ったんだけど。
こういうのって、他に、なんかいい方法とかありまつか?
0686デフォルトの名無しさん
NGNG# 並列処理(あるいはOS)の教科書のring buffer見れば載っている。
シングルスレッドならdesign patternにずばりlazy evaluationってのがある。
0687682
NGNGwindows用のライブラリとかあるんですかね。
lazy evaluationってどんなやつですか?
値が必要になってから計算すること?Haskelみたいなやつ?
それと、今回のとどう関係するのかわかんないです。
デザインパターンのlazy evaluationってのはどんなやつなんですか?
0688デフォルトの名無しさん
NGNGwritefuncでの処理も含めて全部別スレッドにして
親スレッドは処理の終了を待つだけにしたほうが
シンプルで速いと思うけど。
0689デフォルトの名無しさん
NGNGWin32 を使っているのならば、スレッドではなく、Fiber を使ってみたらどうだろう?
0690デフォルトの名無しさん
NGNG> C++でpthread_cleanup_push/popって使ってOKでしたっけ?
> docs.sun.com見ると、とりあえずSolarisは問題ないみたいなこと書いてありますが。
例外とのからみでなんかあったかも。あとデストラクタが呼ばれるかとか
そのへんでもなんかあったかも。Boost.Threadはキャンセルサポートしてないね。
ACEはcancelあるみたいだけど、どういう仕組みになってんのかね。
0691デフォルトの名無しさん
NGNGhttp://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/classACE__POSIX__Asynch__Accept.html
0692デフォルトの名無しさん
NGNGスッドレには関係なさそうなお燗
0693デフォルトの名無しさん
NGNGhttp://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/namespaceACE__OS.html#a385
などではなかろうか。単にpthread_cancelを呼んでいるだけぽ。
0694デフォルトの名無しさん
NGNGhttp://www.dre.vanderbilt.edu/Doxygen/Current/html/ace/Asynch__Connector_8h-source.html
のコメントに「POSIXからは他のスレッドからキャンセルできる」って書いてあるよ。
0695デフォルトの名無しさん
NGNG教えてください。
0696デフォルトの名無しさん
NGNG0697デフォルトの名無しさん
NGNG> WINNY
サンクス。FC2のglibcのsrc.rpmの中には入ってたわ。
0698デフォルトの名無しさん
NGNGglibcに入ってるよ。
0699デフォルトの名無しさん
NGNGpthread_mutex_lock(mutex);
この2つをアトミックにしたいのです
sem_wait()から起き上がったら
誰にも邪魔されずにpthread_mutex_lock()できるように。
この間だけSCHED_FIFOの最高プライオリティにすることで
対処しようとしていますが、あってますか?
注
アトミックにすることなんて考えないで
その2つをpthread_cond_wait()に置き換えるというのは
もう除外されてます。
0700デフォルトの名無しさん
NGNG> もう除外されてます。
じゃあ無理です。
0701デフォルトの名無しさん
NGNG探しています。しかしBindとApacheみたいな限定されたアプリケーションしか
まだPthreadを使っていないですよね。UNIXのPthread対応がまちまちなのが
原因なのはよく分りますが。他に何か良いもの(コンパクトで良質なソース)が
ありますでしょうか?
0702デフォルトの名無しさん
NGNG?
0703デフォルトの名無しさん
NGNG複数のスレッドが参照するグローバル変数がある。
一つのスレッドのみがこの値を変えることができ、他のスレッドは参照するのみである。
クリティカルセッション等はいっさい使用していない。
よろしくお願いします。
0704デフォルトの名無しさん
NGNG# アトミックなアクセス=アクセス操作が二つに分割されない。
atomic dataのone write-locking, many read-lockingってやつです。
0705デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNG実質。
0708デフォルトの名無しさん
NGNG0709デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNGWin64/x86ならWoWでWin32アプリ動くし制限もきつくなる方向じゃなくて緩くなる方向じゃないか。
0711デフォルトの名無しさん
NGNGsemaphore, mutex
0712デフォルトの名無しさん
NGNGLONG spin_count = 0; // どっかグローバルなところ。
void Lock()
{
while( ::InterlockedExchange( &spin_count, 1 ) != 0 )
Sleep(0);
}
void UnLock()
{
::InterlockedExchange( &spin_count, 0 );
}
0713デフォルトの名無しさん
NGNG付いてなかったっけ?
0714デフォルトの名無しさん
NGNGいや用語なんて人によってつけ方いろいろなんでどうでもいいんだけど。
>>713
最初からWin32のEnterCriticalSection/LeaveCrtiticalSection
の内部実装は基本的にスピンロックを使ってる。
しかもリカーシブ。
Win32用語のスピンカウントってのは
マルチプロセッサ時にあるカウントを超えてスピンしようとしたときに
セマフォによるブロッキングに代わる。そのカウントのこと。
そのカウントを指定できるようにしたのが
>>713がいうスピンカウント機能付き。(だと思う)
InitializeCriticalSectionAndSpinCount(),
SetCriticalSectionSpinCount()
でもこのスピンカウントはAPIで指定しなくても
レジストリのどこかで指定できると思った。
0715デフォルトの名無しさん
NGNG0716デフォルトの名無しさん
NGNG0717デフォルトの名無しさん
NGNGthanx.
古い本にスレッド下で問題のある関数の例に malloc() が出ていたんで心配してました。
0718デフォルトの名無しさん
NGNGコンパイルがうまく通らないみたいです。
どなたかご教授お願いします。
class CHoge
{
public:
bool Initialize();
private:
void * Thread(void* param);
// Thread専用
pthread_mutex_t m_mutex; // ミューテックス
pthread_t m_tidx;
pthread_attr_t m_attr;
}
-----
bool CHoge::Initialize()
{
pthread_mutex_init(&m_mutex, NULL);
pthread_attr_init(&m_attr);
pthread_create(&m_tidx, &m_attr, Thread, (void *)NULL); //ここでコンパイルエラー
}
void * CHoge::Thread(void* param)
{
//あんなことやこんなことを・・・
}
0719デフォルトの名無しさん
NGNG0720デフォルトの名無しさん
NGNG{
pthread_mutex_init(&m_mutex, NULL);
pthread_attr_init(&m_attr);
pthread_create(&m_tidx, &m_attr, CHogeThread, (void *)this); //ここでコンパイルエラー
}
static void * CHogeThread(void* param)
{
CHoge *hoge = static_cast<CHoge*>(param);
hoge->....
//あんなことやこんなことを・・・
}
0721デフォルトの名無しさん
NGNGstaticつけるとコンパイルは通るのですがメンバーへのアクセスがうまくできないためだめみたいです・・・
>>720
クラスからはずしてClassのポインタを渡して実行するという手ですね。
なるほどです。ためしてみたのですが
privateメンバーへのアクセスが直接できないためpublicに移動(これはだめでしょ・・)
するかすべてにGetなんたらという関数を作成する形になってしまいます。
これではすこしきびしいようです。
0722デフォルトの名無しさん
NGNG0723デフォルトの名無しさん
NGNGpthread_create(&m_tidx, &m_attr, CHoge::Thread, (void *)this); //ここでコンパイルエラー
0724723
NGNG{
public:
bool Initialize();
private:
static void *Thread(void *param);
// Thread専用
pthread_mutex_t m_mutex; // ミューテックス
pthread_t m_tidx;
pthread_attr_t m_attr;
};
bool CHoge::Initialize()
{
pthread_mutex_init(&m_mutex, NULL);
pthread_attr_init(&m_attr);
pthread_create(&m_tidx, &m_attr, CHoge::Thread, (void *)this);
}
void *CHoge::Thread(void* param)
{
return NULL;
}
0725デフォルトの名無しさん
NGNGclass CHoge
{
.
private:
static void* StaticThread(void* param);
void * Thread(void* param);
.
};
bool CHoge::Initialize()
{
std::pair<CHoge*, void*>* param = new std::pair<CHoge*, void*>;
param ->first = this; param ->second = NULL;
pthread_attr_init(&m_attr);
pthread_create(&m_tidx, &m_attr, Thread, (void*)param);
}
/*static*/ void*
CHoge::StaticThread(void* param)
{
void* return_value;
std::pair<CHoge*, void*>* param2 =
static_cast<std::pair<CHoge*, void*>*>(param);
return_value =
param2 ->first ->Thread(param2 ->second);
delete param;
return return_value;
}
コンパイルチェックしてないけど、どう?
0726725
NGNGC++でスタティックなコールバック関数を
thisポインタつきのメンバー関数にどう置き換えるのか
という問題でスレ違いとおもうのだが。。。
すれ違いついでにいうと、CHoge::StaticThread(void*)で
CHoge::Thread(void*) が例外を投げたときに
delete paramされるようにしたほうがいいか。
0727718
NGNG問題はstaticで宣言したルーチンでstaticではないものを使用しようとした結果
怒られてたみたいなので、そこからもうひとつ関数を呼び出すことで対処できました。
助言ありがとうございました。
class CHoge
{
public:
bool Initialize();
private:
static void * Thread(void* param); //こいつはstaticで
void ThreadMain(); //こいつでThreadのメイン処理を行う。
// Thread専用
pthread_mutex_t m_mutex; // ミューテックス
pthread_t m_tidx;
pthread_attr_t m_attr;
}
0728718
NGNGbool CHoge::Initialize()
{
pthread_mutex_init(&m_mutex, NULL);
pthread_attr_init(&m_attr);
pthread_create(&m_tidx, &m_attr, CHoge::Thread, (void *)this);
}
void * CHoge::Thread(void* param)
{
CHoge *hoge = static_cast<CHoge*>(param);
hoge->ThreadMain();
}
void CHoge::ThreadMain()
{
//あんなことやこんなことを・・・
}
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNGソースコードはどうやって書いたらいいのでしょうか?
#ifdef _REENTRANT
マルチスレッドを考慮したコード
#else
シングルスレッドだけ考えた軽いコード
#endif
みたいな、コンパイラから渡される_REENTRANTのようなマクロって
ありますか?
0731デフォルトの名無しさん
NGNG#ifdef _MT
0732デフォルトの名無しさん
NGNGありがとう。早速やってみます。
0733デフォルトの名無しさん
NGNGgccにて-pthreadオプションが使えないんですが、pthreadを使った
プログラムはどうやってコンパイルすればいいですか?
0734デフォルトの名無しさん
NGNG-pthreadなくてよかったんじゃなかった?
0735デフォルトの名無しさん
NGNG#include <pthread.h>のみ
man gccするとplatform固有のoption一覧あり。
0737デフォルトの名無しさん
NGNG> #ライブラリがもともとthread safe に出来てるってことなのかなぁ?
全てのライブラリ? まさか…
MT-Safeかどうかは、それぞれの関数のmanを参照せよ。
0738デフォルトの名無しさん
NGNG0739デフォルトの名無しさん
NGNGHP-UXでも11i辺りから「_REENTRANTはobsoleteだ」とかmanに
書いてあったような。
0740733
NGNG>
>全てのライブラリ? まさか…
>MT-Safeかどうかは、それぞれの関数のmanを参照せよ。
それぞれのって、1個ずつ・・・orz
libc_r..aみたいな、thread safeなライブラリ群ってないのですね。
0741デフォルトの名無しさん
NGNG0742デフォルトの名無しさん
NGNGportはpeerのidentityが分かるから認証系には有利だな。
0743デフォルトの名無しさん
NGNG0744デフォルトの名無しさん
NGNGSleepからの復帰はResumeThreadでは無理なのでしょうか。
0745デフォルトの名無しさん
NGNG0746デフォルトの名無しさん
NGNGイベント使ってタイムアウト付で待機しとけ
0747デフォルトの名無しさん
NGNGありがとうございました。
やはり処理系によってちがうのですね。
0748デフォルトの名無しさん
NGNG知ったかぶんな
0749723
NGNG>解説
>関数が成功すると、スレッドのサスペンドカウントが 1 増やされます。
>ResumeThread
>スレッドのサスペンドカウントを 1 減らします。サスペンドカウントが 0 になると、スレッドが実行されます。
そしてSleepの説明ではサスペンドカウントについて何も書かれていない。
頭悪いな。
0750デフォルトの名無しさん
NGNGいろいろサンプルを見た限りではInitializeCriticalSectionの後に
失敗したかどうかのチェックをしてないようなんですけど
失敗すると引数のポインタはNULLになってるとかいう事ってないんですか?
0751デフォルトの名無しさん
NGNG呼び出し側のポインタを渡すんだが・・・何か勘違いしてないか?
0752デフォルトの名無しさん
NGNG0753デフォルトの名無しさん
NGNG0754デフォルトの名無しさん
NGNG石橋を叩き壊すくらい用心深いならGetLastErrorを呼べばいい
0755750
NGNGあんまり気にしないで先に進みます
0756デフォルトの名無しさん
NGNGこんな感じの、マルチスレッドの定石みたいなものを記したページってどこかに無いでしょうか?
0757デフォルトの名無しさん
NGNGその本買えば?
0758デフォルトの名無しさん
NGNGWindowsスレッドの場合定石以外に知っとくこと多いから
最大公約数的な本みてもあまり役に立たない。
スレッドとメッセージループの関係とか、カーネルハンドルとか・・
0759デフォルトの名無しさん
NGNG0760デフォルトの名無しさん
NGNGカーネルハンドルって何ぞや?
0761デフォルトの名無しさん
NGNGWinのスレッドの使い方と、マルチスレッドのパターンって全く分野が違うと思うんだが
なぜにそんな話が出てくるんだ?
0762デフォルトの名無しさん
NGNGんなこたーない
0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNG現在UNIXのforkを多用したマルチプロセスプログラムをWindows(VC++)に
移植しています。
親玉のプロセスが、画面や通信などシステム上必要な全てのプロセスをforkで
生成する構造です。
Windowsにはforkが無いので変わりにスレッドで代用しようと考えているの
ですが、staticやグローバル変数の排他の問題を上手く対処さえすれば
それ以外でスレッドに変えた事による問題はないのでしょうか?
他になにか考慮が必要な点などありましたらアドバイスお願いします。
0765在日参政権反対
NGNG0766デフォルトの名無しさん
NGNG0767デフォルトの名無しさん
NGNGfork()してヒープとスタックの複製が出来たということは、
単に排他をすればいいというものではなくて、
別のメモリオブジェクトになっているという事ですが、
それは了解済みですか?
それからFILE *の扱いは、
> staticやグローバル変数の排他の問題
には収まりきらない部分もあるので注意が必要です。
0768デフォルトの名無しさん
NGNGありがとうございます。
書かれた内容は「UNIX上では別オブジェクトで分かれていたメモリ領域が、
スレッドになる事によって1つになり共用されてしまう事の重要性」
と認識したのですが合っていますでしょうか?
FILE*の扱いについてはよく分かりませんでした。
概要や調べるキーワードで結構ですので教えてもらえませんか。
構造をばらしてプロセス数分のプロジェクトを作ったほうが確実なのかと
思い始めてきました。目の前が暗いです。。。。
0769在日参政権反対
NGNG別プロセスでいいならそのほうがいいんじゃない?
無駄だとは思うけど、堅牢性は上。
0770デフォルトの名無しさん
NGNG子プロセスへは記憶域をコピーできないので、
子プロセス起動時に環境変数にして渡すか、
親側で共有メモリを作っておいて子側で開始時に共有メモリを読み取る。
どっちにしろ親の設計が、記憶域にアドレス情報を含むオブジェクトだった場合は、かなり厳しい。
グローバル変数はこれでどうにかなるとして、問題は関数内のスタティック変数。
関数の設計から見なおす必要が出てくる危険もある。
ただ、多くの場合、子プロセスは親と同じプロシージャを全部必要とするわけではないので、
親と子で共通する変数・関数を各プロジェクトから独立したヘッダ&ソースに記述するのがよいでしょう。
0771デフォルトの名無しさん
NGNG0772デフォルトの名無しさん
NGNG「MPI並列プログラミング」って本がある.
あとは「MPI」「並列」とかでググればいくつか出てくるよ.
ってか,MPIとマルチスレッドって関係あった?
0773デフォルトの名無しさん
NGNGhttp://mikilab.doshisha.ac.jp/dia/smpp/cluster2000/index.html
http://lucie.is.titech.ac.jp/bbs/clusterteam/
http://mikilab.doshisha.ac.jp/dia/seminar/2003/
0774デフォルトの名無しさん
NGNG0775デフォルトの名無しさん
NGNG0776デフォルトの名無しさん
NGNG0777デフォルトの名無しさん
NGNG小さなグローバル変数ならTLS( _declspec( thread ) )が便利。ただし fork のように値がコピーされないのが難。
http://support.microsoft.com/default.aspx?scid=kb;ja;409547
0778デフォルトの名無しさん
NGNGスレッドをまたいでSendMessageするときは受け側(CreateWindowを呼び出した時のスレッド)がメッセージループ内にいなければならず
ロックしやすいかも
0779デフォルトの名無しさん
NGNG問題ありますか?
それとも、ちゃんとmutex使うかCANCELしたほうがいい?
EXTERN func_C();
bool bLoop;
// bLoopは参照のみ
func_B()
{
while ( bLoop )
{
func_C();
}
}
// スレッド生成&bLoopを操作
func_A()
{
pthread_t thread;
bLoop = true;
pthread_create( &thread, NULL, func_A, NULL );
sleep(10);
bLoop = false;
pthread_join( thread );
}
0780デフォルトの名無しさん
NGNG0781在日外国人参政権反対
NGNG何のためにmutexがあるのかよく読んで来い
0782779
NGNGあるのかな?という質問です。(いなくなった人のソースなので、意図が・・)
bLoopの操作はfunc_A()だけでアトミックだろうし、毎回bLoopをチェック
するごとにロックしないでも誤動作しないかも?とか思っちゃったわけでして。
0783デフォルトの名無しさん
NGNG0784デフォルトの名無しさん
NGNGどうしてもやりたいなら
volatile bool bLoop;
0785デフォルトの名無しさん
NGNG0786デフォルトの名無しさん
NGNG「グローバル変数をあまり使うな」という普通の注意を別にすれば、全く問題ないよ。
高速化がどうとかいう以前の普通のコード。このパターンで mutex は出番ないでしょ。
volatile はまぁ好みでつけた方がよいとは思うけど。
0787デフォルトの名無しさん
NGNGそもそもこれは何をしたいの?
いちどだけFUNC_Cを実行したいということ?
10ミリセクに根拠はないし、while(bloop)でチェックするまでに10ミリセク経たない保証はないし
きわめて悪質なバグを誘発する可能性のあるコードでないの?
0788787
NGNG0789デフォルトの名無しさん
NGNGこれSMPだとまずいんじゃないの?
0791デフォルトの名無しさん
NGNGというソフトウエアをたまに見るが、その理由をいま目の当たりにしている訳だな。
0792デフォルトの名無しさん
NGNG0793デフォルトの名無しさん
NGNGバグがあった。変な同期処理とかもいっぱい見てきた。
0794779
NGNGあくまでも例なのですが、10秒間funcCを呼び続けます。
(本当は任意のタイミングでbLoop=falseになります。)
簡単にキリのいいところ(funcCを呼び出す前)でthreadを終了できるのが
メリットなのかも?
0795デフォルトの名無しさん
NGNGプログラムでマクロ時間を根拠に大丈夫だろうコードを書いてるとそのうち痛い目にあいますよ
0796デフォルトの名無しさん
NGNG0797デフォルトの名無しさん
NGNGsleep(3) は***秒単位***だ。
0798デフォルトの名無しさん
NGNG藻前アフォだろ
大文字と小文字の区別もできないのか?
0799デフォルトの名無しさん
NGNGsleep(3)
0800デフォルトの名無しさん
NGNGなかでsleepしてるならbLoopを落としてもそんなに早く、即!、抜けるわけじゃないし。
ビジーループだたらガクブル
0801デフォルトの名無しさん
NGNG0802デフォルトの名無しさん
NGNG0803デフォルトの名無しさん
NGNG0804デフォルトの名無しさん
NGNG0805デフォルトの名無しさん
NGNG0806デフォルトの名無しさん
NGNGfunc_A()
{
pthread_create( &thread, NULL, func_A, NULL );
}
0807デフォルトの名無しさん
NGNG>>790
0808デフォルトの名無しさん
NGNG0809デフォルトの名無しさん
NGNG(↑別スレかもしれん)
それはともかくとして、>>779 はとりあえずセマフォで通知するようにでもしとけば、
SMP でも問題なくなると思う。
0810デフォルトの名無しさん
NGNG0811デフォルトの名無しさん
NGNGapacheのヤツ?あれは割禁してないとかそういう話しではないの?
0812デフォルトの名無しさん
NGNGfunc_A から例外を送出することは可能ですか?
強制的にスレッドを停止させずに終了処理したいところなんですが。
0813デフォルトの名無しさん
NGNG0814デフォルトの名無しさん
NGNG0815デフォルトの名無しさん
NGNG以下の、ソースをコンパイルしようとしたのですが、
_beginthreadex
が定義されていませんというエラーが出ます。
process.hはインクルードしてるのですが
何が問題なのでしょうか?
コンパイラはVC6.0とBCC5.5です
0816デフォルトの名無しさん
NGNG#include <windows.h>
#include <process.h>
#include <stdio.h>
unsigned _stdcall ChildThreadProcedure(LPVOID lpMutex){
//引数をミューテックスバンドルに変換
HANDLE hMutex=(HANDLE)lpMutex;
//このスレッドのID
DWORD dwThreadId=GetCurrentThreadId();
//3回
for(int n=0; n<3 ; n++){
//ミューテックス獲得を待つ
DWORD dwResult=WaitForSingleObject(hMutex,INFINITE);
if(dwResult==WAIT_OBJECT_0){
printf("Thread 0x%08x - acquired the mutex.\n",dwThreadId);
Sleep(500);
printf("Thread 0x%08x - releasing the mutex.\n",dwThreadId);
ReleaseMutex(hMutex);
Sleep(500);
}else{
printf("Thread 0x%08x - error calling WaitForSingleObject().\n",
dwThreadId);
return 0xffffffff;
}
}
return 0;
}
0817デフォルトの名無しさん
NGNGint main(void){
HANDLE hChildThread[3];
HANDLE hMutex;
//ミューテックス作成
hMutex=CreateMutex(NULL,FALSE,NULL);
if(hMutex==NULL){
printf("Primart thread - error calling CreateMutex().\n");
exit(0xffffffff);
}
//子スレッド作成
unsigned uUnusedThreadId;
hChildThread[0]=(HANDLE)_beginthreadex(NULL,0,ChildThreadProcedure,(void*)hMutex,0,&uUnusedThreadId);
hChildThread[1]=(HANDLE)_beginthreadex(NULL,0,ChildThreadProcedure,(void*)hMutex,0,&uUnusedThreadId);
hChildThread[2]=(HANDLE)_beginthreadex(NULL,0,ChildThreadProcedure,(void*)hMutex,0,&uUnusedThreadId);
if(!hChildThread[0] || !hChildThread[1] || !hChildThread[2]){
printf("Primary thrad - error creating child thread.\n");
exit(0xffffffff);
}
//全てのハンドルを閉じる
CloseHandle(hMutex);
CloseHandle(hChildThread[0]);
CloseHandle(hChildThread[1]);
CloseHandle(hChildThread[2]);
return 0;
}
/*以上*/
0818デフォルトの名無しさん
NGNGprocess.hを胃袋に穴が開くほどよく読め。
0819デフォルトの名無しさん
NGNGprocess.hにはプロトタイプ宣言
unsigned long _RTLENTRY _EXPFUNC _beginthreadex(void *__security_attr,
unsigned __stksize,
unsigned (__stdcall *__start)(void *),
void *__arg,
unsigned __create_flags,
unsigned *__thread_id);
がありますが、やはりよく分かりません。
もう少しヒントお願いします。
0820デフォルトの名無しさん
NGNGそれはまだ胃袋に穴が開くほど読んでいない。
が、それだけだとあんまりなのでヒント。
"CPPを使ってみな。"
0821デフォルトの名無しさん
NGNGというかそんなのはググれよ!
0822デフォルトの名無しさん
NGNGシングルスレッドとしてコンパイルする設定になる。
>>815はデフォルトのままでプロジェクトをビルドしようとしているに、10000ペソ。
0823デフォルトの名無しさん
NGNGオプションを設定したら、コンパイルできました。
ありがとうございました。
0824デフォルトの名無しさん
NGNGなんで解答*だけ*を教えるような真似するかな。。。
それだと何が起きてるかさっぱり理解できないままだから
何も力が付かないんだけどな。
0825デフォルトの名無しさん
NGNGいいんだよそれで。力のつく人間はほっといても力がつく。
0826デフォルトの名無しさん
NGNGそもそも「_beginthreadex 定義」で検索するとすぐ出てくるしな。
たぶんエラーメッセージも
> '_beginthreadex' : 定義されていない識別子です。
> 外部シンボル "__beginthreadex" は未解決です。
で、
>>815
> _beginthreadex
> が定義されていませんというエラーが出ます。
正確には写してないんだろうな。
0827デフォルトの名無しさん
NGNGそんなことはないだろ。お前のやり方は単なる時間のムダだ。
お前に新人指導は無理。
>>822はヒントを言ったが、どこの項目をどう変更すべきかは一切触れてない。
>>820にみたいに的外れな"CPP"がどうとか言ってたのはお前じゃないよな?
天然で"CPP"と回答したとしたらかなり笑える。プゲラ>>820
0828デフォルトの名無しさん
NGNGしかも ad-hoc な解決法だけだ。
少し苦労してでも調べれば、根本の部分から解決できる問題を
調べもせずに質問するような中途半端な似非クソグラマには
「本当の力」なんてつけさせてやんねー。
質問地獄に陥るって? 漏れなら別にかまわん。
面倒くさい時は「わかんねー。ごめんなw」で済ませている。
プロジェクトが滞ってるのは、その似非クソグラマのせいだ。
ちなみに真の意味での世界最臭のクソは、漏れだw
0829デフォルトの名無しさん
NGNGCPPを使えっていう意味がさっぱりわからんのだが、
どういう意味なんだ?
C++使えって意味か?
ソースみれば、C++で書かれてるのなんて明らかじゃないか。
0830デフォルトの名無しさん
NGNG問題解決の本質的問題なのかと
子一時間問い詰めたい。
0831デフォルトの名無しさん
NGNGアレな言い分ではあるけど、たぶんインクルードしたヘッダで確かに _beginthreadex が
宣言されているかどうか、cpp 通したあとの出力を見てみろ、ということだと思う。
漏れの手元の処理系には cpp なんて無いけどね。
0832デフォルトの名無しさん
NGNG・若い芽を摘み取りたい。
・最近とみに目が霞んで、若手よりコーディングが遅くなって危機感に襲われている。
このうちのどれだ?>>824よ。
0833デフォルトの名無しさん
NGNG0834デフォルトの名無しさん
NGNGhttp://blogs.msdn.com/cbrumme/archive/2003/05/17/51445.aspx
いまこの記事を読んでいるんですが、結論としては、「x86や(現在の)IA64
では、メモリバリアなしのdouble checked lockingが安全」なのでしょうか?
あ、JavaやC#ではなくC++で書いた場合を想定しています。
また、実際に上記のようなdouble checked lockingが誤動作するプロ
セッサはあるのでしょうか?ARMやPPCやAlphaでは誤動作します?
コンパイラは妙なinstructionのreorderをしないと仮定してかまいません。
よろしくおねがいします。
0835デフォルトの名無しさん
NGNGLinux Kernel 関連のメーリングリストを読むと、どのようなプロセッサであっても、
(上のリンクや IBM のドキュメントにあるような理由とは異なりますが)チェック対象のメモリへの
書き込みが遅延させられることによる誤動作は発生し得ます・・・
ただし、メモリバリア処理を行わない排他手段が存在すれば、の話です。
実際には、クリティカルセクションに入るための処理、出るための処理は必然的にメモリバリアと
なるため、C++ やアセンブラでの double checked locking は(正しく書かれれば)常に正常に動作します。
0836デフォルトの名無しさん
NGNG要は、Java や C# にあるような初期化に先んじてポインタ値がメモリに書かれるようなことが無ければ、
C# でいうところの lock {} 等のアセンブラレベルでの実装がメモリバリアを(必然的に)兼ねてしまうので
問題の起こしようがない、というようなことです。
0837834
NGNGレスありがとうございます。
まず、クリティカルセクション(やpthread_mutex_lock/unlock)がメモリバリアになるという点は了解です。
クリティカルセクションの入退場があれば、そこをまたぐようなreorder(コンパイラ/CPU両方の)は行わ
れないのですよね。
(http://www.microsoft.com/whdc/driver/kernel/MPmem-barrier.mspx にもその旨明記してありました)
> 要は、Java や C# にあるような初期化に先んじてポインタ値がメモリに書かれるようなことが無ければ、
まさにそこ、「コンストラクタが走るより前にポインタ値がメモリに書かれる」ことがないか心配してます。
if(!instance) {
lock;
if(!instance) {
tmp = new T;
// (*)ここにメモリバリアを置かなくてOK?
instance = tmp;
}
unlock;
}
return instance;
の(*)の部分を心配しているという感じです。如何でしょうか?
0838デフォルトの名無しさん
NGNG> Linux Kernel 関連のメーリングリストを読むと、どのようなプロセッサであっても、
> (上のリンクや IBM のドキュメントにあるような理由とは異なりますが)チェック対象のメモリへの
> 書き込みが遅延させられることによる誤動作は発生し得ます・・・
ソースキボンヌ
0839デフォルトの名無しさん
NGNGソースは無いので取り消します。
0840デフォルトの名無しさん
NGNGC++ では代入文の中には sequence point が無いので、
一旦 temp に受けないとまずそうですよね。
でもメモリバリアは要らないんじゃないですか?
tmp = net T; の末尾が sequence point になるので、
instance = tmp より先に実行されることが C++ 的には保証されているから。
0841デフォルトの名無しさん
NGNGC++処理系が別CPUからのvisibilityまで考慮してくれるかというと微妙じゃないですか?
有名なこのURLを見ると、C++でもバリア使えとかいてあるですよ(Making it work with explicit memory barriers のトコ)
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
0842デフォルトの名無しさん
NGNGDouble-Checked Locking, Threads, Compiler Optimizations, and More
http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
Memory caching and synchronization
http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=22908
Boost.Thread Memory Visibility
http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/threads.html
0843デフォルトの名無しさん
NGNGで問題ない
0844843
NGNG0845デフォルトの名無しさん
NGNGsequence point をキーにしたら良いペーパーを発見できました。
ありがとう>840さん
>Double-Checked Locking, Threads, Compiler Optimizations, and More
>http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
が凄くすばらしいです。Scott Mayersさんがthanks to Doug Leaで書いたものなので
信用します。私の疑問にことごとく答えていますし。
結論としては、メモリバリアが必要ということで(p.29)。
ありがとうございました。
0846デフォルトの名無しさん
NGNG解説を。
0847デフォルトの名無しさん
NGNG必要ない。;がseq. point。
0848デフォルトの名無しさん
NGNG> tmp = net T; の末尾が sequence point になるので、
> instance = tmp より先に実行されることが C++ 的には保証されているから。
カレントスレッドからはそのように見えることが保証される、ってだけで
他のスレッドからもそのような順序で見えるってことまでは保証されていないはず。
0849デフォルトの名無しさん
NGNGですね。
0850デフォルトの名無しさん
NGNG0851デフォルトの名無しさん
NGNG0853デフォルトの名無しさん
NGNGおまえとんだ誤解してるぞ
0854834
NGNG読み間違っていますか?特に移植性は問題にしてないんですが…。
特定のCPUで動けば。
あ、それとも参照している先の文章が間違っている?
0855デフォルトの名無しさん
NGNGinstance = tmp ;
まずこの式がこのままである保障は全くない。
tmpの値が他で使われなければ省略される。
シーケンスポイント(副作用完了点)はこの場合関係ない。
よって
instance = net T;
と等価。
0856834
NGNGそれは承知してます(例のpdfのp.16でも言及されています)。
メモリバリアを挟むことを前提で>>837はtmpを使って書きました。
他にもなにかあればお願いします。
0857834
NGNGコンパイラの最適化を妨げる、コンパイラに固有のなにかを挿入するつもりです。
例えばgcc+IA64なら
tmp = new T;
__asm__ __volatile__("mf":::"memory");
instance = tmp;
どうでしょう?
0858デフォルトの名無しさん
NGNG外側のif(!instance) {も不要
0859834
NGNG> そもそも837のソースはtmp不要
> 外側のif(!instance) {も不要
その通りなんですが、パフォーマンスを稼ぎたいんですよね。
…正確に言うと、某CPUが数発のマシンでDCLを(バリアなしで)使ってる人に、バリア使うか858のように書き直せと言いたいんです。そのための調査をしていまして。
自分はどちらかというと858派ですと付け加えておきます。基本的にはパフォーマンスより安全・確実な方を選びたいですね。
#完全synchronizeのペナルティがイヤならTLSにでもポインタいれとけばぁ?と思う。
0860デフォルトの名無しさん
NGNG元質問は↓コレな罠
>「x86や(現在の)IA64
>では、メモリバリアなしのdouble checked lockingが安全」なのでしょうか?
0861デフォルトの名無しさん
NGNG0862デフォルトの名無しさん
NGNGLockにコスト掛かるならそれでいいよ。
それとLock中にinstanceをどう扱おうがメモリバリアは不要。
つまりtmp不要。
0863デフォルトの名無しさん
NGNGつまり
if(!instance) {
lock;
if(!instance) {
instance = new T;
}
unlock;
}
return instance;
で良いということ?
0864デフォルトの名無しさん
NGNGIA32,IA64共にそれで問題ない。
0865デフォルトの名無しさん
NGNG>ARMやPPCやAlphaでは誤動作します?
は?
0866デフォルトの名無しさん
NGNG�AそれとLock中にinstanceをどう扱おうがメモリバリアは不要。
2の主張は正しいよ。でも、1のinstance参照はLockを伴っていないよ?なんで安全と思うのか知りたいところだ
0867デフォルトの名無しさん
NGNGint i;
for (i < sizeof(instance)) *tmp++ = *p++;
とかしない限り問題ない。
0868デフォルトの名無しさん
NGNGfor (i < sizeof(instance)) *p++ = *tmp++;
0869デフォルトの名無しさん
NGNG0870デフォルトの名無しさん
NGNGint i = sizeof(instance);
while (i--) *p++ = *tmp++;
0871デフォルトの名無しさん
NGNG>>843=844=850=855=858=862=864=867=868=870
0872ageてみる
NGNG0873デフォルトの名無しさん
NGNGなんで安全じゃないと思うんだ?
思い込みばっかしてないで仕様書よめ。
0874デフォルトの名無しさん
NGNG> なんで安全じゃないと思うんだ?
> 思い込みばっかしてないで仕様書よめ。
ISO/IEC 14882:2003 にスレッドの話題は出てこない。IEEE Std 1003.1, 2004 4.10 では必ずロックしろと書いてある。
ロックしないで変数触る場合はプラットフォーム固有の何かをしないとダメ。その方法については
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
でガイシュツ。IA32で問題ないのはそのとおり。が、問題ないCPUばかりじゃないから此処で今話題になってる。
あ、>>834はWindowsみたいだがUNIXの話題ですまんね。
0875デフォルトの名無しさん
NGNG> if(!instance) {
> lock;
> if(!instance) {
> tmp = new T;
> // (*)ここにメモリバリアを置かなくてOK?
> instance = tmp;
> }
> unlock;
> }
> return instance;
>
> の(*)の部分を心配しているという感じです。如何でしょうか?
厳密には、(*)にメモリバリアを置いただけでは不十分。
(*)だけだと「メインメモリへの書き出し順序」は保証されるが、
他のCPUがそれを読み込む順序までは保証されない。
とはいえ、IA32やIA64ではそんな心配は無用だが。
> ARMやPPCやAlphaでは誤動作します?
確かAlphaでは上記の現象が問題になる可能性があったと思うが、
ソースを失念した。スマソ。
0876デフォルトの名無しさん
NGNGKeyboard* Keyboard::instance() {
Keyboard* temp = pInstance; // read pInstance
Perform acquire; // prevent visibility of later mem. ops.
// from preceding pInstance’s read
if (temp == 0) {
Lock L(args);
if (pInstance == 0) {
temp = new Keyboard;
Perform release; // prevent visibility of earlier mem. ops
// from succeeding pInstance’s write
pInstance = temp; // write pInstance
}
}
return pInstance;
}
らしい。
>875
SPARC系ってどうなんすかね
0877デフォルトの名無しさん
NGNG> 外側のif(!instance) {も不要
おいおい。
元々のお題がSingletonパターンなんだよ。
毎回lockしたらinstance()が遅いだろ。
0878デフォルトの名無しさん
NGNG> 厳密には、(*)にメモリバリアを置いただけでは不十分。
> (*)だけだと「メインメモリへの書き出し順序」は保証されるが、
> 他のCPUがそれを読み込む順序までは保証されない。
>
> とはいえ、IA32やIA64ではそんな心配は無用だが。
IA32/64でも、(*)の部分のバリアだけは必要なんでつか?
おしえてください。
0879デフォルトの名無しさん
NGNGつまりこういう問題がある?
・CPU A は首尾よく instance の初期化を完了。メモリバリアでメモリへ全てを書き出す。
・CPU B は Double-Checked Locking を開始。変数 instance がキャッシュに乗っていなくてメモリから読む
・instance の指す先のメモリはたまたまCPU Bのキャッシュに残っていて(内容はゴミ)、instance->bar() とかでアボーン。
よく考えれば、変数 instance だけではなく、それが指すオブジェクト自体他のCPUでコンストラクトされている(可能性がある)わけだから、
利用に先立って少なくともreadキャッシュの無効化が必要だよなぁ。
0880デフォルトの名無しさん
NGNG> おいおい。
> 元々のお題がSingletonパターンなんだよ。
> 毎回lockしたらinstance()が遅いだろ。
SingletonパターンというかDCLパターンだね。
つーか >>843=844=850=855=858=862=864=867=868=870=873 は放置の方向で。
0881デフォルトの名無しさん
NGNGWindowsやPOSIX準拠OSが動く環境は、普通はcache coherentです。
つまりreadキャッシュの無効化だとかなんだとかはH/Wで自動解決されるから
プルグルマは気にしなくていい。
気にしないといけないのは、"他CPUからみて、自CPUがどのような順番でメモリ
を読み書きしたように見えるか"。そういう他CPUの観測具合を制御するのがメモリ
バリア。
細かいけど…。
0882881
NGNGメモリバリアだから、「複数スレッドが触る変数を操作するのは常にクリ
ティカルセクション内にする」を徹底すればプルグルマは楽をできる。
というか、普通のプログラマにハードウェアの詳細、メモリモデルについ
て知っておけというのはムリなので、そうするのが良いアイディア。bool
変数だからロックしなくていいよね?とかよく聞かれるけど、俺は常に
ダメだちゃんとロック汁と返答しがち。
DCLもプロファイリングしてボルトネークになってることが確定しない
限りは考えないほうがいいようにおもう。どっかで出てたように最悪
TLSでキャッシュすればよろし。
0883843
NGNG酷い言われようだが、俺が突っ込んだ書き込みして呼び水にならなかったら
おまえらは全然動かなかったろ。>865辺りからやっと湧いて出たアホども
ありがたく思えよ>834
0884デフォルトの名無しさん
NGNG0885デフォルトの名無しさん
NGNG「>>840 は間違っていて tmp = XXX; instance = tmp は結局 instance = XXX;
に最適化される(してもよい)ので無意味」
って感じのレスがあったけど、これ本当ですか?
XXX が副作用をともなうコードであって、かつ ; のところが end of full expression でシーケンスポイントなんだから、
最適化によって instance = XXX と同じコードになろうがなるまいが、instance への書き込みがオブジェクトの
初期化に先んじることはないと思うんだけど(SMPでのメモリバリアの問題は別として)。
0886デフォルトの名無しさん
NGNG0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNG0889875
NGNG> 確かAlphaでは上記の現象が問題になる可能性があったと思うが、
ソース見つけた。
http://www.cs.umd.edu/~pugh/java/memoryModel/AlphaReordering.html
つーか>841のページからおもいっきりリンクされてるし。
>>882
> DCLもプロファイリングしてボルトネークになってることが確定しない
> 限りは考えないほうがいいようにおもう。どっかで出てたように最悪
> TLSでキャッシュすればよろし。
もしくは、pthread_once(3)のようなシステムが用意してくれてるAPIを使うとか。
DCLが有効なアーキテクチャではpthread_once()の内部でDCLを使ってるかもしれんが、
使う側からはそういう内部実装を一切気にしなくて良い。
0890875
NGNG> IA32/64でも、(*)の部分のバリアだけは必要なんでつか?
> おしえてください。
他の人も言っているように、IA32/64なら(*)の部分のバリア無しでもちゃんと動く。
ただし、IA32ならMTRRという機能があって、こいつを使うと
Out of Orderなメモリ書き出しなどができるようになる。
これを使うと、メモリアクセスの性能は大幅に向上する(XFree86 3.xを使ってた人なら
よく知ってるだろう)が、DCLのようなアルゴリズムは全く動かなくなってしまう。
0891デフォルトの名無しさん
NGNGLinuxThreadsのpthread_onceの実装はモロに使ってます>DCL
0892デフォルトの名無しさん
NGNG目から鱗〜
ところで>>834のリンク先のblogを見ると、IA64は本来weak ordering
なのだが現在のCPUはそうなってないとか書いてあるけど、そのへん
どう思います?
よみ違ってたらスマソ
0893デフォルトの名無しさん
NGNG0894デフォルトの名無しさん
NGNG0895デフォルトの名無しさん
NGNG0896デフォルトの名無しさん
NGNG0897デフォルトの名無しさん
NGNG0898デフォルトの名無しさん
NGNG0900デフォルトの名無しさん
NGNGみなさんが仕事でマルチスレッドを使う割合ってどれぐらいですか?
0901デフォルトの名無しさん
NGNG0902デフォルトの名無しさん
NGNG0903デフォルトの名無しさん
NGNG0904デフォルトの名無しさん
NGNG0905デフォルトの名無しさん
NGNG0906デフォルトの名無しさん
NGNG0907デフォルトの名無しさん
NGNG> > IA32/64でも、(*)の部分のバリアだけは必要なんでつか?
> > おしえてください。
> 他の人も言っているように、IA32/64なら(*)の部分のバリア無しでもちゃんと動く。
あくまで、「コンストラクタ実行の後に変数instanceへの代入を行うコードを
コンパイラが必ず生成する」という前提があればの話ね。
でも、でも必ずしもそうとは限らないようだ。
ttp://www.nminoru.jp/~nminoru/diary/2004/10.html#2004-09-06
0908デフォルトの名無しさん
NGNGそれはSunのコンパイラが使いものにならないことの証明でしかない。
0909デフォルトの名無しさん
NGNGもまいは問題を理解していないようだな
0910デフォルトの名無しさん
NGNGまぁCPUによらず、コンパイラの最適化抑制はしときましょうってことで。
gccなら asm("":::"memory");
0911デフォルトの名無しさん
NGNGVC++とSun純正のC++コンパイラの場合は?
0912デフォルトの名無しさん
NGNGVC++7以降なら
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf_readwritebarrier.asp
0913デフォルトの名無しさん
NGNGさんくす子。ところで>>837の
>まず、クリティカルセクション(やpthread_mutex_lock/unlock)がメモリバリアになるという点は了解です。
>クリティカルセクションの入退場があれば、そこをまたぐようなreorder(コンパイラ/CPU両方の)は行わ
>れないのですよね。
>(http://www.microsoft.com/whdc/driver/kernel/MPmem-barrier.mspx にもその旨明記してありました)
KeMemoryBarrier()が使えるのはドライバのみ?
0914デフォルトの名無しさん
NGNG0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNGするにはどうしたら良いですか?
例えばa,b,cのスレッドがあってまずスレッドaを起動して何処か途中
任意でスレッドbにスイッチ(スレッドaはそこで一時停止)、同じ様に
スレッドbからスレッドcにスイッチ、スレッドcからスレッドaへスイッチすると
スレッドaの途中から再開みたいな動きです。
0917デフォルトの名無しさん
NGNG環境は?OSは?CPUは?
0918デフォルトの名無しさん
NGNG環境:VC++6.0
OS:Windows2000
CPU:Pen4
って感じです。
0919デフォルトの名無しさん
NGNG0920デフォルトの名無しさん
NGNGファイバですか・・・ちょっと調べてみます。
ありがとうございました。
0921デフォルトの名無しさん
NGNG0922デフォルトの名無しさん
NGNG0923デフォルトの名無しさん
NGNG0924デフォルトの名無しさん
NGNG0925デフォルトの名無しさん
NGNGコンテキスト切り替えを任意のタイミングでできると
何かうれしいことがあるの?
0926デフォルトの名無しさん
NGNG発想が逆。
スレッドは落とし穴が多いし重い(マイクロスレッドより)から使いたく
ないけど、並列処理もどきは行いたいことがある。コンテキスト切り替え
が嬉しいのではなくて、コンテキスト切り替えの面倒を被ってでも「気楽
で軽いスレッド」が欲しい。
…といったところか?
0927デフォルトの名無しさん
NGNG疑問符で終らすなヴォケ
0928デフォルトの名無しさん
NGNG答えられないなら黙ってろよ
0929デフォルトの名無しさん
NGNGコルーチン(マイクロスレッド、ファイバ)パターンで記述すると
楽なものに対して使う。
0930デフォルトの名無しさん
NGNG─- 、::::;;;;;;;;;`゙゙''‐ 、 __,,,,......,,,,_/:::::::::/: !|
. : : : : : : `゙'ヽ、:::゙ヾ´::::::::::::::::::::::`゙゙゙'''‐'、. l|
、、 . : : : : : : : : r'":::::::::::::::::::::::::,r':ぃ::::ヽ::::::::ヽ! ,、- 、
.ヽ:゙ヽ; : : : : : :ノ:::::::::::::::::::::;;、-、、゙::: rー-:'、 / }¬、
. \::゙、: : : :./::::::::::::::;、-''":::::::::: ,...,:::,::., :::':、 _,,/,, ,、.,/ }
ヽ:ヽ、 /::::::::::::::::::::::::: _ `゙''‐''" __,,',,,,___ /~ ヾ::::ツ,、-/
`ヽ、:::::::::;;;、、--‐‐'''''',,iニ- _| 、-l、,},,  ̄""'''¬-, ' ''‐-、 .,ノ'゙,i';;;;ツ
_,,,、-‐l'''"´:::::::' ,、-'" ,.X,_,,、-v'"''゙''yr-ヽ / ゙゙'ヽ、, ,.' j゙,,, ´ 7
,、-''" .l:::::::::::;、-''" ,.-' ゙、""ヾ'r-;;:l 冫、 ヽ、 / __,,.ノ:::::ヽ. / パターンだって。(ヴァカ?)
l;、-'゙: ,/ ゞ=‐'"~゙゙') ./. \ / '''"/::::;:::;r-''‐ヽ
,、‐゙ ヽ:::::..,.r'゙ ,,. ,r/ ./ ヽ. ,' '、ノ''" ノ
,、‐'゙ ン;"::::::. "´ '゙ ´ / ゙、 ,' /
' //::::::::: {. V /
/ ./::::::::::::: ', / /
. / /:::::::::::::::::. ',. / ,.、 /
0931デフォルトの名無しさん
NGNG,.‐'´ `''‐- 、._ヽ /.i ∠,. -─;==:- 、ゝ‐;----// ヾ.、
[ |、! /' ̄r'bゝ}二. {`´ '´__ (_Y_),. |.r-'‐┬‐l l⌒ | }
゙l |`} ..:ヽ--゙‐´リ ̄ヽd、 ''''  ̄ ̄ |l !ニ! !⌒ //
. i.! l .::::: ソ;;:.. ヽ、._ _,ノ' ゞ)ノ./
` ー==--‐'´(__,. ..、  ̄ ̄ ̄ i/‐'/
i .:::ト、  ̄ ´ l、_/::|
! |: |
ヽ ー‐==:ニニニ⊃ !:: ト、
おれたちはとんでもない思い違いをしていたようだ。これを見てみろ。
まず「クソスレ」を英字で表記する
『KUSOSURE』
これを逆にすると、
『ERUSOSUK』
そしてこれを更に日本語に直すと
『エルソサク』
スレを立てたのが>>1と言う事を考えれば末尾に『クソスレ』を加えるのが当然だ。
すると導き出される解は
『エルソサククソスレ』
そして最後の仕上げに意味不明な文字『エルソサク』
これはノイズと考えられるので削除し残りの文字を取り出す。
するとできあがる言葉は・・・・・・『クソスレ』。
つまり!『クソスレ』とは『まさにこのスレッド』を表す言葉だったのだ!!
0932デフォルトの名無しさん
NGNG[cppll:6196] マイクロスレッド
を見るのがいいとおもうんだけど、いま過去ログサーバが落ちてるね。
0934デフォルトの名無しさん
NGNG0935デフォルトの名無しさん
NGNG初めてみた
0936デフォルトの名無しさん
NGNG0937デフォルトの名無しさん
NGNGint main () { pthread_exit(0); }
0938デフォルトの名無しさん
NGNGちゃんと確認して作ってますか?
0939デフォルトの名無しさん
NGNG0940デフォルトの名無しさん
NGNGどうやって確認してます?
0941デフォルトの名無しさん
NGNG0942デフォルトの名無しさん
NGNGリエントラントにしただけのもあるし、
スレッド間で共有するリソースの競合まで吟味したものもある
最初から意識して作るしかないだろう
0943デフォルトの名無しさん
NGNG潜在するロジック上のバグと違い、スレッド関連は明らかにヒューマンエラー。
0944デフォルトの名無しさん
NGNGええっ!?
ロッキングロジック上の馬具は一体何?
0945デフォルトの名無しさん
NGNG0946デフォルトの名無しさん
NGNG0947デフォルトの名無しさん
NGNG{
private:
static Singleton instance;
Singleton();
public:
static Singleton getInstance();
};
Singleton::Singleton()
{
}
static Singleton Singleton::getInstance()
{
if(instance == null){
LOCK();
if(instance == null){
instance = new Singleton();
}
UNLOCK();
}
return instance;
}
0948デフォルトの名無しさん
NGNGシンプルだし、最適化がどーのなんて悩まないで済むんだし。
0949デフォルトの名無しさん
NGNGそれで済むときはそれで構わない。
# 但しシングルトンの時も、シングルトン間の初期化の順序を制御したい場合、
# 動的に確保されるシングルトンの場合はダメ。
またDCLはオブジェクトがある条件を満たした時に、
初めて行われるポインタメンバーの初期化などに必要。
0950デフォルトの名無しさん
NGNG> 最初から意識して作るしかないだろう
同一のインスタンスに対する並行アクセスはダメ、というケースはよく見るね
使う側からすると、下手にロックされても困る場合もあるから
ライブラリの設計は難しい・・・
0951デフォルトの名無しさん
NGNG次スレよろ
参考リンクも何もないな
以下テンプレ
マルチスレッドプログラミング相談室 その3
その1 http://pc3.2ch.net/test/read.cgi/tech/997345868/
その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/
0952デフォルトの名無しさん
NGNG0953デフォルトの名無しさん
NGNG0954デフォルトの名無しさん
NGNG0955デフォルトの名無しさん
NGNG0956デフォルトの名無しさん
NGNG0957デフォルトの名無しさん
NGNG0958デフォルトの名無しさん
NGNG0959デフォルトの名無しさん
NGNG0960デフォルトの名無しさん
NGNGだからそれじゃだめだと何度言ったら…
0961デフォルトの名無しさん
NGNG0962gccで
NGNG#include <linux/compiler.h>
barrier();
#elifdef XXX
XXX();
#else
#error Unknown system about memory barrier!!!
#endif
0964デフォルトの名無しさん
NGNG何がダメなのよ?
0965デフォルトの名無しさん
NGNG0966デフォルトの名無しさん
NGNGループするのはやめときます。
0967デフォルトの名無しさん
NGNG0968デフォルトの名無しさん
NGNG0969デフォルトの名無しさん
NGNG2重チェックなんか無駄でしょう。
このメソッドを連続して複数回呼ぶとしたらそのつくりがおかしい
メソッド全体にロックかければ十分
0970デフォルトの名無しさん
NGNGすでにインスタンス作ったのにインスタンス取得の度にロックするほうが時間の無駄でしょうが
0971デフォルトの名無しさん
NGNGそうはしないし、それならば多少時間がかかっても問題がない。
無意味な最適化をするとバグを混入する原因となりかねないのでシンプルにしたほうがいいと考えています。
0972デフォルトの名無しさん
NGNG>getInstanceをループの中で毎回呼ぶのですか?
ハァ?(゚Д゚)
0973デフォルトの名無しさん
NGNG>
>ハァ?(゚Д゚)
ハァ?(゚Д゚)。Lock処理で何ミリセク処理時間が増えるか知らんが、その呼び出しが問題になるほど繰り返し呼び出すとしたら呼び出してるほうが問題なんだろうが。
キャッシュするなりすればいいという意味だろ。
0974デフォルトの名無しさん
NGNGなるべく透過的にキャッシュしたいね、という話をしているわけだが。
俺としてはガイシュツのTLSがいいとおもうね。
0975デフォルトの名無しさん
NGNG手持ちのDDKには無かったぞ?
0976デフォルトの名無しさん
NGNGマルチスレッドプログラミング相談室 その3
マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。
その1 http://pc3.2ch.net/test/read.cgi/tech/997345868/
その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/
Pthread -- POSIX Thread Mailing List
http://www.media.osaka-cu.ac.jp/mailman/listinfo/pthread
0977デフォルトの名無しさん
NGNG0978デフォルトの名無しさん
NGNG$ WRITE SYS$OUTPUT "VMS使いのおじいさんですか?"
0979デフォルトの名無しさん
NGNGDCL使ってプロジェクトを破滅に追いやるオマエ茂名。
0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNGまともな言語だって思ってたんだけど、2ch見てるとHSPと同じような位置にしか見えない。
C++なぞ問題外発言の所為?
0983デフォルトの名無しさん
NGNG木構造の接点それぞれにスレッドを割り当てるプログラムで、
枝接点は、ほとんど何もしないラッパー的なスレッドで、
主な処理は、葉接点にあたるスレッドが行うというものですが、
重い葉接点スレッドの実行数を制限すれば、全体で数百〜千スレッド逝っても大丈夫でしょうか。
0984デフォルトの名無しさん
NGNG0985デフォルトの名無しさん
NGNG>木構造の接点それぞれにスレッドを割り当てるプログラムで、
>枝接点は、ほとんど何もしないラッパー的なスレッドで、
>主な処理は、葉接点にあたるスレッドが行うというものですが、
まあ、話のタネに聞いておくが、
何でそんなものが必要なんだ?
0986デフォルトの名無しさん
NGNGアンチC++やアンチPerl色が強すぎてある意味宗教じみてた頃があったからかな?
今はどうなのか知らないけど
0987983
NGNG汎用的な処理を行うシェルのようなプログラムを作成しているのですが、
階層別にグループ化が必須なので。
で、スレッド暴走時の対処や、ある階層以下のすべてのスレッドに命令、セキュリティは?
とか考えると、ルートを一つにするよりも、全部スレッドにしたほうがいいかなと思いまして。
まあ、どっちにしろ最大スレッド数あたりを設定して、そこからあふれた場合はキューにためておいて、
スレッド数が減ってきたら、キューから読んでスレッド作成という動作を実装する必要がありますが。
0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNG0990デフォルトの名無しさん
NGNG0991950
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1098268137/l50
関連URL他にないですかねぇ。
0992デフォルトの名無しさん
NGNGpthread_barrier_wait(&b);
std::2ch << "1000ゲット!!" << std::endl;
レス数が950を超えています。1000を超えると書き込みができなくなります。