- 1 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 11:23:05 ]
- マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/test/read.cgi/tech/997345868/ その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/
- 652 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:00:17 ]
- >>640>>650
pthread_createで作ったスレッド間では、ファイルディスクプリタは共有されます。 すなわち、同じ数値=同じソケット端点。 何がいいたのか知らんがこれでいいか?
- 653 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:06:07 ]
- >>651
どっちがいいのかはわからんけど、このスレじゃ解決できなさそうじゃん。
- 654 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:20:45 ]
- Linuxのスレッドが特別なプロセスだったのは、2.4より前の話だよ。
# 例えばpidやsignalの扱いなど。 >>627は、2.6.17だから関係ない。
- 655 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:21:59 ]
- >>637
> accept() 成功後にスレッド作るように書かないと駄目なようですね。 そんなことはない。
- 656 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:22:13 ]
- >>652
それは知ってますよ。だからこそOSがおかしいんじゃないかと思ったんですから。 元々の質問を要約すると、まだ close() されていないファイル ディスクリプタの値を accept() が返して来るのは何故かです。 一つのスレッドが accept() で 5 を受け取ったとして、それが close() される前にもう一つのスレッドが行った accept() が 受け取ったファイルディスクリプタの値も 5 だったということです。 これ、accept() を一つのスレッドでしかやらなければ当然 6 などの 違う値が返って来ます。 >>653 今のところそんな感じしますね。
- 657 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:24:17 ]
- >>654-655
そうですか…。じゃあ何でだろう?
- 658 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:26:01 ]
- こっちの方がいいかも。
UNIX板 pthread地獄 pc8.2ch.net/test/read.cgi/unix/1010933537/ 読んでる人はこの板と重複がかなりあるかもだけど。
- 659 名前:デフォルトの名無しさん mailto:sage [2006/07/19(水) 16:34:42 ]
- >>658
そこはたしかに近いこと話し合われてたスレですね。 じゃあそこに移転します。 こちらのスレのみなさまありがとうございました。
- 660 名前:636 mailto:sage [2006/07/19(水) 23:13:46 ]
- な?
- 661 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 01:05:07 ]
- うはwww
ボッコボコwww しかも自分のミスwww
- 662 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 12:50:33 ]
- >>640>>650
お前等も黙ってないで「ファイルディスクリプタの説明」してくれよw
- 663 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 13:12:28 ]
- File Disk Riptor 略して FDR である
- 664 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 14:35:46 ]
- なんか車の駆動方式っぽい略称だな。
- 665 名前:627 mailto:sage [2006/07/20(木) 16:04:12 ]
- 申し訳ありません。私がバグっておりました。
accept() 後の処理を別関数でやっていたのですが、その中で fdopen() を使って accept() で受け取ったファイルディスク リプタから FILE * を作って fgets() や fprintf() を使って いました。それでその関数から返る直前に fclose() をして いますが、そうすると当然元となったソケットも close() されます。 このことをすっかり忘れていたためこの別関数から戻って 来ても accept() で取ったファイルディスクリプタは オープンしたままだと思い込み、別関数から帰って来てから close() までの間に別スレッドで accept() した時の ファイルディスクリプタと同じ値になることがあったため、 今回の疑問に繋がっていました。 ということでお騒がせしました。 Linux でも複数スレッドからの accept() は問題無くできます。
- 666 名前:デフォルトの名無しさん mailto:sage [2006/07/20(木) 16:25:36 ]
- まあせいぜい地雷原を走り抜けてくれ
- 667 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 20:41:07 ]
- Javaだと複数のスレッドがacceptでブロックしてても動いたと思う。
ttp://www.amazon.co.jp/gp/product/4274065200/ の例の1つにあったと思う。 個人的にはとても気持ち悪いし、他の人にコードを見せると頭を抱えるし、 特にメリットも思いつかないので、 自分はJavaでもacceptは1つのスレッドで実行してる。
- 668 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 20:54:45 ]
- この人の場合、さらに non-blocking にしてあって、ブロックしないでポーリングしてるらしいよw
- 669 名前:デフォルトの名無しさん mailto:sage [2006/07/21(金) 21:16:04 ]
- >>667
> 特にメリットも思いつかないので、 はあ
- 670 名前:デフォルトの名無しさん mailto:sage [2006/07/22(土) 00:47:01 ]
- 試したことはないが、
複数のThreadがServerSocket#accept()でブロックされてるとき、 ブロック解除で起こされるThreadはたぶん唯1つなのがメリットじゃないかな。 単一のThreadがaccept()待ち→ブロック解除→Queueに放り込んでWorker Threadを たたき起こすパターンだと、Queueを監視する複数のWorker Threadがいったん たたき起こされるから。
- 671 名前:デフォルトの名無しさん mailto:sage [2006/07/23(日) 09:39:44 ]
- pThreadsについての書籍を探してるのですが、以下のもの読まれてる方
感想はどうですか?良書ですかね? www.amazon.com/gp/product/1584503718/ref=pd_rvi_gw_1/103-0885486-2811001?%5Fencoding=UTF8&v=glance&n=283155 www.amazon.com/gp/product/0735710430/ref=pd_rvi_gw_2/103-0885486-2811001?%5Fencoding=UTF8&v=glance&n=283155
- 672 名前:デフォルトの名無しさん [2006/07/26(水) 17:24:59 ]
- お世話になります。
識者のご意見ください。 以下のような状況です。(環境はVC6のWin32API) メインスレッドAと、待機スレッドBがあります。 BはSuspend状態です。 あるタイミングでAがBに仕事を投げてResumeしました。 Bは仕事が終わったら自分でSuspend状態になりたいのです。 Bは自分のHANDLEをSuspendThreadしちゃってもいいものでしょうか? AがBのフラグを見てSuspendしてやるというのはちょっと効率が 悪い気がします。 以前はBを待機スレッドではなく、その都度生成して自殺させていました。 が、この方法だとデバッグウインドウに生成と消滅のメッセージが 出まくるのと、やはりCreateThreadの負荷が気になります。 こういう場合の常套手段など、ご教示ください。 待機スレッドがCPUを食わないようにするために、Suspend状態に しておく、という風に考えるのは変でしょうか? よろしくお願い致します。
- 673 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 17:36:12 ]
- >>672
ただのワーカースレッドでええんちゃうかと マイクロスレッドのようなものを考えてるなら、ファイバでも使えばいい
- 674 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 17:36:23 ]
- >>672
自分をSuspendするのは悪くない。というか、それが唯一のSuspendThreadの正しい使い方。 基本的には自スレッド以外をSuspendThreadしてはいけない。 ただし、普通はautoresetのイベントハンドルを用意して WaitForSingleObject で待たせておき、 SetEventで起こす。これはAがBをResumeThreadで起こすのが難しいから。 具体的には、SuspendThread/ResumeThreadで待機を実現しようとすると、 ResumeThreadするときに、ちょうどBが何かの仕事を終えてSuspendThreadする 直前だったりするとResumeしても即Suspendしてしまうので、これを避けるために クリティカルセクションとフラグが1つ余分に必要になってしまって効率も悪いし コードもムダに複雑になる。
- 675 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 18:07:51 ]
- みなさん、レス有難うございます。
>>674 >autoresetのイベントハンドルを用意して WaitForSingleObject で待たせておき こんな感じでしょうか? スレッドB{ while(1){ WaitForSingleObject(XXX); 何か仕事(B*) } } スレッドA{ while(1){ 何か仕事の準備(実行中のB*の部分を触らない配慮はしている) SetEvent(XXX); } } >直前だったりするとResumeしても即Suspendしてしまうので なんとなく現象の心当たりがあります。
- 676 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 18:21:59 ]
- >>675
Bが待機するところはそんな感じです。 あとまぁよく使うパターンとしては (1) AがBの仕事の完了を待たずににいくつもの仕事を投げておけるようにQueueに仕事を登録して SetEvent する。Bは起こされたら、Queueにある仕事を全て実行してからWaitする。 (2a) 「仕事終わったよイベント(初期値はON)」ってのも用意して、Bが仕事を終えたらSetEventする。Aは仕事終わったよイベントを待ってからBを起こす (2b) CreateSemaphoreでMaxCount 1 のセマフォを作って、AはWait,→仕事の準備→ReleaseSemaphore、 BはWait→仕事を取り出して実行→ReleaseSemaphore とする。 仕事が終わったかどうか知りたくなることも多いので、漏れは2aのパターンを多用します。 殆ど等価な 2b でもいいのかも知れない。
- 677 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 19:36:15 ]
- >>676
Suspend,Resumeでやってたところを待機オブジェクトにしました。 すっきりした感じがします。 >(2a) なんとなくこれっぽいことはやっていました。 どうもありがとうございました。
- 678 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 21:47:50 ]
- lock-freeについて調べている内に
CAS(CompareAndSwap)という概念にたどりついたのですが ちょっと教えてください。 /* 関数内の処理はatomicに処理されると仮定*/ bool CAS(void*addr,int expval,int newval){ if(*addr == expval){ *addr = newval;return true; } return false; } *addr=0; while(!CAS(addr,0,*addr + 1)){ //※ここでコンテキストスイッチ } //アトミックにインクリメント成功? 例えば※の部分で別スレッドがaddrの値を5に変更→0に変更 という動きをした場合、*addr == expvalが成り立ってしまい、 インクリメント成功とみなされてしまう気がするのですが・・・ 何か回避策等あるんでしょうか。それとも俺の理解不足なんでしょうか
- 679 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 23:07:03 ]
- >>678
「アトミックなインクリメント」というものを理解していないような気がする。 過去に5だったかどうかはさておき、他のスレッドで0にされたものが1に なるのだから成功している。 というか5で放置されてて6になってもやはり成功。 *addr=0; IntgerlockedIncrement(&addr); ←APIによるアトミックなインクリメント などとしたところで、この2行の間に*addrが5になって0になることもある。 「アトミックなインクリメントに失敗」というのは、2つのスレッドで1度ずつ アトミックなインクリメント操作が行われたにも関わらず2増えないことを言う。 これは正しい実装では決して起きない。
- 680 名前:デフォルトの名無しさん mailto:sage [2006/07/26(水) 23:07:59 ]
- 追記:
CASによるアトミックなインクリメントの実装は、正しくは↓ while (!CAS(addr, *addr, *addr+1) {}
- 681 名前:678 mailto:sage [2006/07/27(木) 21:49:17 ]
- >>679
>>680 ありがとうございます。 addr=&val; while(!CAS(addr,*addr,*addr + 1)){ //※ここでコンテキストスイッチ } でも問題が起きそうな気がするんですが・・ とここまで書いて www-06.ibm.com/jp/developerworks/java/041203/j_j-jtp11234.html に似たような事が書いてありました ABA問題というらしいですが もうちょっと勉強してでなおしてきます・・
- 682 名前:デフォルトの名無しさん mailto:sage [2006/07/27(木) 23:41:31 ]
- とりあえず、CAS(xxx, *addr, *addr+1)
なんて書いている奴は氏んでいいよ。 atomic_inc(int *addr)は do { int var = *addr; } while (!CAS(addr, var, var+1)); にしないと。 まあ、複数のスレッドで勝手に値をセットするような変数を 特定の個所だけatomic_incを使っても意味は無いがね。
- 683 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 00:03:12 ]
- 終わった話題についてなにを得意げに語ってるんだろう…。
- 684 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 00:20:12 ]
- >>682
それC言語的にやばいやん。
- 685 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 00:31:47 ]
- つまり、「ほんと、バカしかいないんだね」ってことか。
- 686 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 00:43:19 ]
- やーい
ばかー
- 687 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 07:26:02 ]
- volatileですべて解決!
- 688 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 12:24:47 ]
- >>682
バカは喪前のほうだと思うが・・・ なぜ自分がバカなのかが知りたかったら、 元のコードの問題点を書いてご覧よ。 書いてるうちにわかるだろ。
- 689 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 17:51:17 ]
- 元のコードの問題点は関係なくて
*addrを2度読み出して同じ値が取れると思っているのがバカだって事だろ。
- 690 名前:デフォルトの名無しさん mailto:sage [2006/07/28(金) 17:53:25 ]
- しかも、この手のバグは非常に表面化しにくく
再現性が低い(デバッグが難しい)。
- 691 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 15:08:13 ]
- volatileですべて解決するという忠告がみえないのか?
- 692 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 16:14:19 ]
- 別CPUから発言が見えるようになるまでには時間がかかります
- 693 名前:デフォルトの名無しさん [2006/07/29(土) 18:15:53 ]
- VC++とMFCでマルチスレッドなサーバープログラムを書いています。
サーバープログラムを終了する時、ソケットが走ってるスレッドを終了させないといけませんが、 スレッドに終了を通知する手段が分かりません。 どのように終了を通知するのか教えていただけないでしょうか。 よろしくお願いします。
- 694 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 19:01:50 ]
- ソケットをどういう風に使ってるかによると思うけど、イベントとか単なるフラグとか。
- 695 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 19:36:20 ]
- >>693
ExitProcessで自殺すればおk
- 696 名前:693 mailto:sage [2006/07/29(土) 19:49:37 ]
- CAsyncSocketを継承して作ったUDPのソケットです。
クライアントからやってくるパケットをRecvFromで受けて、データに応じてSendToしているだけです。 現在、スレッドを閉じるのにdeleteでデストラクタを呼び、強制的に終了させているのですが デバッガで追っかけていくとCAsyncSocketの中でエラーが発生します。 詳細は不明ですがおそらくソケットを閉じずに終了したためではないかと思います。 Win32APIでマルチスレッドなプログラムを組んだときはPostThreadMessageで終了メッセージを 送って、WaitForSingleObjectでスレッドが落ちるのを待っていたのですが、MFCで そのような手順を踏んだ終了の仕方は(強制終了じゃないやり方)ないのでしょうか?
- 697 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 20:28:56 ]
- CAsyncSocketて使ったことないから知らないけど、
非同期に通信してるなら終わりにするかどうか判断する機会はあるんじゃないの?
- 698 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 20:48:34 ]
- CAsyncSocketのデストラクタが動けば万事OKみたいなことMSDNには書いてあるけど。
スレッドを強制終了するから、そのスタックにあるCAsyncSocketがリークしてるとか、 そういうこと?
- 699 名前:693 mailto:sage [2006/07/29(土) 21:12:35 ]
- >>697
複数台の設備との通信をするサーバープログラムなのですが、設備のON/OFFとサーバーのON/OFFは 必ずしもリンクしていません。一応作業標準として順序だてることは可能ですが、予想外のトラブル(瞬停など)を 考えると何かのパケットが来たらソケットを閉じてもいいとはできません。 サーバープログラムを閉じる作業中にソケットが走っているスレッドに終了を通知できればいいのですが その方法がわからないのです。 >>698 >そのスタックにあるCAsyncSocketがリークしてるとか そのとおりです。
- 700 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 21:18:08 ]
- スレッドが終了する時のイベントハンドラで
CAsyncSocketをdeleteじゃダメって事?
- 701 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 21:24:23 ]
- >>700
今はスレッドのデストラクタでCAsyncSocketをdeleteしていますが、その中でエラーになります。
- 702 名前:デフォルトの名無しさん [2006/07/29(土) 21:38:00 ]
- ねぇ。マルチスレッドって何?
- 703 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 21:40:39 ]
- multi 【名-1】 (複数{ふくすう}の色調{しきちょう}からなる)縞模様{しま もよう} 【名-2】 マルチビタミン(錠剤{じょうざい})
thread 【名-1】 (繊維を束ねた)糸、より糸 【名-2】 糸[繊維]状のもの、細い筋状のもの 【名-3】 (全体をつなぎ止める)筋、(話などの)脈絡{みゃくらく}
- 704 名前:デフォルトの名無しさん [2006/07/29(土) 21:53:15 ]
- 縞模様の筋ですか?
- 705 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 21:55:30 ]
- 筋肉のことですか?
- 706 名前:デフォルトの名無しさん mailto:sage [2006/07/29(土) 22:29:03 ]
- >>691
まさかとは思うけど、本気で言ってるわけじゃないよね?
- 707 名前:デフォルトの名無しさん [2006/07/30(日) 00:24:25 ]
- >>689
だって別に同じ値じゃなくても問題ないんだよ。 単にその1度のCAS呼び出しがfalseになるだけ。
- 708 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 00:32:23 ]
- >>707
第3引数の *addr + 1 を評価した後に別スレッドによって *addr の値が変更され、 その後に第2引数の *addr が評価されるとアウト。
- 709 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 09:43:28 ]
- >>701
スレッドを強制終了させないで、外部から何かきっかけを与えて自分で終わるようにすればいいだけじゃん。
- 710 名前:デフォルトの名無しさん mailto:sage [2006/07/30(日) 15:36:23 ]
- >>691>>707
>>708の言うように、 「CASの第2引数の値」と「CAS呼び出し時に*addrに入っている値」 これが違うのは問題ないが 「CASの第2引数と第3引数の値の差」が1でない場合に誤動作する。 コンパイラの最適化で読み出しが1回になるケースもあるだろうが 最適化オプションで動作が異なるのはデバッグを難しくするだけ。 volatileを使えば、読み出しが2回になることが保証されるだけ。
- 711 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 13:37:43 ]
- 一般的な双方向リストをマルチスレッドで使うとまずいですか?
new -> next = next; /* ここでスレッドが切り替わるとか? */ new -> prev = next -> prev; みたいな事が起きるとうまく繋げないような気がします。 WinAPI を使ってオブジェクトかなにか?を作って排他制御する 必要があるのでしょうか?
- 712 名前:デフォルトの名無しさん [2006/07/31(月) 13:41:09 ]
- 問題ないw
- 713 名前:デフォルトの名無しさん mailto:sage [2006/07/31(月) 15:11:21 ]
- >>711
まずい。複数スレッドからappendすると、ノードが行方不明になったりする。 ただ、スレッドセーフな双方向リストにするより、 外部の同期オブジェクトを使ってそのリストへのアクセスを同期化する方が 柔軟。
- 714 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 06:53:40 ]
- volatileですべて解決!!!
- 715 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 10:44:44 ]
- この話では無理w
- 716 名前:デフォルトの名無しさん [2006/08/01(火) 11:20:51 ]
- >>711
問題ない 関数内ではスレッドの切り替えは起こらない
- 717 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 11:51:13 ]
- preemption はいつでも起こりうるでしょ
- 718 名前:716 [2006/08/01(火) 12:39:23 ]
- 起こらないでしょ
- 719 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 12:43:33 ]
- >>716
何を根拠に言ってんの?
- 720 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 12:51:51 ]
- ようやくWindowsのメッセージディスパッチのことを理解したばかりのヒトが
それをマルチスレッドだと思い込んでるんでしょう。
- 721 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:19:11 ]
- >>716 は、ユーザレベルスレッドしか使った事無い人なんでしょうかね。
- 722 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:23:44 ]
- >>716はWin3.1ユーザー
- 723 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:24:48 ]
- 実装がユーザレベルかカーネルレベルかと、プリエンプティブかコ・オペレーティブかは関係ないだろ。
- 724 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 13:33:14 ]
- 関数内では起こらないってのもすごいよな。
普通は全てmainの関数内なんだが。 まあWndProcはまた別だが、それもWinMain内ででGetMessageしてるわけだし。
- 725 名前:716 [2006/08/01(火) 14:35:50 ]
- 反省^^
- 726 名前:デフォルトの名無しさん mailto:sage [2006/08/01(火) 22:51:18 ]
- >>723
そこに異論は無いけど、言いたい事は分かるでしょ。
- 727 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 08:14:08 ]
- まあ、あれだ。がんがりたまえ(笑)
- 728 名前:デフォルトの名無しさん [2006/08/02(水) 12:46:56 ]
- 一般的なのはミューティックスを作る方法なの?
- 729 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 13:49:28 ]
- ディスクトップでディスクリプタをミューティックスで保護することを考察
- 730 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 14:34:13 ]
- むてふ
- 731 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 14:47:18 ]
- ティキストエデタ
- 732 名前:デフォルトの名無しさん [2006/08/02(水) 15:05:17 ]
- www
- 733 名前:デフォルトの名無しさん mailto:sage [2006/08/02(水) 23:11:34 ]
- ヴォラタィル
- 734 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 08:56:51 ]
- コンピゥタァ
- 735 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 12:30:55 ]
- モシ NO=735 ナラバ トベ >>1000
- 736 名前:デフォルトの名無しさん [2006/08/03(木) 14:38:59 ]
- static bool g;
if (!g && g = true) {} この if ()の中でスレッド切り替えって起こります? 排他処理になりませんか?
- 737 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 14:54:43 ]
- >>736
その g = true というのは本当に g = grue なのか? それとも g == true の書き間違い?
- 738 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 14:56:56 ]
- あ、俺も書き間違えた。すま。
- 739 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 15:47:48 ]
- >>736
> この if ()の中でスレッド切り替えって起こります? 起こる > 排他処理になりませんか? ならん
- 740 名前:デフォルトの名無しさん [2006/08/03(木) 18:52:39 ]
- w
- 741 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 21:56:53 ]
- ちょっと待てよ。C言語だとするとショートサーキットだよな?
!g の結果が false なら g = true は実行されないよな。 true なら実行される。 排他になるんじゃないか?
- 742 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:01:59 ]
- ひょっとしたら
!g がアトミックじゃない処理系もあるかも
- 743 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:02:10 ]
- ショートサーキットは関係ない。
!gの評価と、g=trueの間にスレッドが切り替わる可能性があれば、排他として役に立たない。
- 744 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:31:23 ]
- アセンブラレベルで考えるんだ
- 745 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 22:49:20 ]
- なんだろ? 書き込み見てると、CPU命令レベルでの挙動に思い至らないのが居るな。
ソースレベルの字面で捉えてコンパイルというのが何なのかまったく知らないよう に思える。 こんなんで日本のプログラマーのレベルは大丈夫なのか? 小中学生だったら 知らなくても無理は無いのか。
- 746 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:05:44 ]
- アセンブラまで降りる必要は必ずしも無いとは思うが
メモリの読み込みと書き出しを同時(atomic)に行うことは (普通は)出来ないということくらいは知っておく必要がある。 もちろん、プロセッサはそのための命令を(普通は)用意しているが コストがかかるため、普通にソースを書いた場合 コンパイラはその命令を使ったコードは出力しない。
- 747 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:16:40 ]
- えらそうに講釈たれてても
> 同時(atomit) この一言で台無しだな。
- 748 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:25:35 ]
- >>747
お前いらないから
- 749 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:36:58 ]
- 必死な子がいるなぁ。
- 750 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:39:29 ]
- >>747
別のプロセッサに割り込まれないように lock等で保護してからxchgしたりincしたりnegしたりするけど それをatomicと言わないとでも? 例えばあるメモリの内容を+1する場合、 「+1する命令をメモリに対して発行する」ではなくて 「プロセッサがメモリを読んで、+1した値をメモリに書き込む」だし。
- 751 名前:デフォルトの名無しさん mailto:sage [2006/08/03(木) 23:58:41 ]
- なに一生懸命説明してるの?
これスレでそんなこと知らない奴なんてあまりいないよ。 俺はただ「atomic」と「同時」って全然違うって言いたいだけなんだが。 まあ俺も atomit とか書いてるようじゃ人のことは言えないわな。(w
- 752 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:03:37 ]
- >>751
もう消えてね(^^)
|

|