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


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

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



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/

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
もう消えてね(^^)

753 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:18:24 ]
>>751
ずいぶん必死ですね。

754 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 00:20:13 ]
最近なりを潜めてる、某キティと文体が似てる・・・

755 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:02:29 ]
読むのと同時に書かないと壊れるメモリもあるだぜ?



756 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:19:47 ]
「atomic」は日本語で言ったら「不可分」ちうことですわ。

757 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 01:23:06 ]
原子力って感じかと思ってた

758 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 03:38:13 ]
分割不可能な最小単位つうことですょ

759 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 03:51:04 ]
つまり、鉄腕アトムは分割不可能と言うことで宜しいか。

760 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 04:08:01 ]
「atomic」には他に「原子の」みたいな意味もあるんですわ。
昔は原子(atom)は物質の不可分な最小単位と考えられていたので。
どっちの意味が先か知らんけどね。

761 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:05:02 ]
で、何が言いたいんだ?

762 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:11:33 ]
atomic bomb 分割不可能な爆弾

763 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:12:41 ]
割ったら被爆しちゃうからね

764 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:17:17 ]
>>761
誰でも知ってるような事をちょっと偉そうにしゃべくってみたかっただけですわ。

765 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:18:59 ]
被爆と被曝



766 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:55:02 ]
>>764
何のために?

767 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 07:57:34 ]
>>760
なに一生懸命説明してるの?

これスレでそんなこと知らない奴なんてあまりいないよ。

768 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 08:37:02 ]
「同時」って書いちゃうヤツ以外はね。

769 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 08:45:15 ]
VRAM(昔のやつ)やWRAM(初代Milleniumが採用した奴)を思い出した。

770 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 09:45:01 ]
>>768
どこが変なのか未だにわからんのだが?

「読み込みと書き込みが同時に出来ない」
だから
「読み込みと書き込みをatomicに出来ない」(バスロックしなければ)
という意味なんだけど?

771 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 09:48:31 ]
>>764
俺は知らなかったからタメになりましたよ
一応ありがとう

772 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 09:53:42 ]
この流れ見て、コンカレントとパラレルの違いが理解出来なかった当時を思い出した

773 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 10:49:55 ]
既に「atom」という言葉があるからこそ、物質の探求の過程で原子にその言葉を当て嵌めたってことくらい
>758を理解していたら考えるまでもないだろ。

774 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:02:32 ]
>>770
同時(simultaneous)と、不可分(atomic)の違い。


775 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:03:28 ]
意味が分からねえ・・・



776 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 11:10:09 ]
>>770
恥の上塗り


777 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 12:38:57 ]
ガキ共の言葉遊びここまで

778 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 12:49:23 ]
じゃあ今から大人の言葉遊びか・・・エロス

779 名前:736 [2006/08/04(金) 13:14:37 ]
if (g = g ? false : true)

この場合でも排他にならない??
アホですまん

780 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:19:58 ]
C言語のレベルでどの式がアトミックになるかという事に依存するのが間違いだと思う。
現存する全ての環境でアトミックに実行されるような式でも、それは処理系依存。

781 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:21:37 ]
その後、原子は分割可能であることが判明してしまいました。

782 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:25:55 ]
陽子と電子に分割できるんだっけ?

783 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:27:46 ]
あと中間子

784 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 13:40:08 ]
それらの素粒子も実は更に……
つーのはやめておこうか。

785 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 14:05:25 ]
>>779
そもそもどう排他したいの?



786 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 14:21:49 ]
mkdir() は atomic らしい

787 名前:779 mailto:sage [2006/08/04(金) 14:38:19 ]
リスト処理でつなげるときに排他したいけど
WinAPI使うしかないみたいですね


788 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 14:39:02 ]
デッドロックになってしまった場合に
一定時間後に解除するような作りにしたいとき

mkdir() だと unlink() すると atomic では
なくなってしまう危険があるので

rename() の方が良いそうです

www.din.or.jp/~ohzaki/perl.htm


789 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:16:39 ]
>>779
もう諦めて、素直に同期オブジェクト使いなさい。

790 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 15:28:11 ]
mutex使わないのはなぜですか

791 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 17:00:56 ]
Windowsでプロセス内だけでいいならCriticalSectionのほうが速いんじゃなかったっけ

792 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 18:32:01 ]
>>787
それならCriticalSectionで十分

793 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 18:35:59 ]
>>787
これもAPIになるけど、InterlockedCompareExchangeとかでも自分でロックを作れる。
ただ、CriticalSection使うほうが簡単でおすすめ

794 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 22:35:03 ]
>>755
> 読むのと同時に書かないと壊れるメモリもあるだぜ?

kwsk

795 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 22:42:15 ]
それはリフレッシュのことかね。



796 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 22:56:05 ]
「メモリなどの外部デバイスに対して複数の入出力をatomicに行うには同時にやるしかない。ロックしないならば」
という文章があったとします。

この文章の最後を無視して
『メモリなどの外部デバイスに対して複数の入出力をatomicに行うには同時にやるしかない』
だけを引用して
「ロックすればいいじゃん。バカじゃねーの?」
と書き込むのは、とても恥ずかしいですね。


では、前半部も無視して
『atomicに行うには同時にやるしかない』
だけを引用し、
「同時とatomicは違うだろ。バカじゃねーの?」
と書き込むのは、どのくらい恥ずかしいことなんでしょうかね。

まあ夏休みだから、「こくご」の能力がちょっと不足している人が現れるのも
仕方ないかもしれませんが。

797 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:29:16 ]
746 名前:デフォルトの名無しさん:2006/08/03(木) 23:05:44
アセンブラまで降りる必要は必ずしも無いとは思うが
メモリの読み込みと書き出しを同時(atomic)に行うことは
(普通は)出来ないということくらいは知っておく必要がある。







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

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

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