[表示 : 全て 最新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/

802 名前:デフォルトの名無しさん mailto:sage [2006/08/04(金) 23:48:16 ]
で、そういう人には揶揄や皮肉は通用しませんね。

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

804 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 00:28:38 ]
>>787
排他だけなら、アセンブラとか、asm文とか使えばいいけど、
CPUを離すのは、API使わないと無理。
# というか使った方がいい。
# ユーザランドだけで実装されたマルチスレッドライブラリもあるけどさ。

805 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 00:31:32 ]
破壊読み出しなのは、コアメモリもそう

806 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 01:45:45 ]
>>803

もちろん、プロセッサはそのための命令を(普通は)用意しているが
コストがかかるため、普通にソースを書いた場合
コンパイラはその命令を使ったコードは出力しない。

807 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:10:07 ]
( ゚д゚)ポカーン

808 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:18:37 ]
急に暑くなったからな。

そっとしておいてやれ。

809 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:23:40 ]
最近近くに引っ越してきたvolatile asmというものですが何か?

810 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 02:31:33 ]
>>746



811 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 09:44:05 ]
volatile最高!!!

無駄にmutexしてる奴、馬鹿杉www

sizeof(int)以下ならlockなんて不要www

812 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 09:54:47 ]
本気で言ってんの?

だからvolatileと排他のロック概念は関係ないっつーの。

volatileは他のコンテキストや割り込みで変更される可能性
があることをコンパイラに知らせて最適化を抑制するだけ。

>sizeof(int)以下ならlockなんて不要www
大抵はうまく行くだろうが、時たま失敗するだろう。

以下を沢山のスレッドつくって呼び出しまくってみな。

volatile int a,b;
void foo(){
a++;
InterlockedIncrement(&b);
}

しばらく走らせていたらaとbが一緒になるか?

813 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 10:14:01 ]
>>811

本気で言っているとしたら
知らない人が知らないところで働いていることを理解できないようですね


814 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 10:18:41 ]
>>812
この人なんかずれてる…

815 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 10:30:47 ]
どの辺がすれてるのかkwsk

816 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 10:33:19 ]
字下げが

817 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 12:49:28 ]
オチがよろしいようで

818 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 14:56:34 ]
>>815
>>811は書き込みの話はしていない、ってことじゃ?
データバスサイズのリードの話に限定するなら、
普通はバスレベルでも割り込まれることはないから
わざわざバスロックする必要はないと。

「無駄にmutex」がツボだと思うんだけど、ちとエスパーすぎるかな。

819 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 15:16:29 ]
やさしすぎだと思う。

820 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 16:42:27 ]
そもそもCではvolatile参照の意味は処理系定義だ。
参照時にlock/unlockする処理系もありうるし、volatile参照を最適化で
削除してしまう処理系もある(マニュアルに書かれている)。

Javaのvolatileはまた違う意味を持っているし。



821 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 19:31:21 ]
ここ読め。
1.8 Program execution [intro.execution]

822 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 21:02:19 ]
>820でFA?

823 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 22:17:01 ]
>>820
volatile 参照の削除はできないだろ。

824 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 22:25:56 ]
>>823
820が言うとおりvolatile参照は処理系定義。
某組み込み向けコンパイラでは、マニュアルに「sequence pointを含まない
式中のvolatile参照は削除されうる」と定義されていたりする。

825 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 22:47:47 ]
>>824
それって、ふたつのシーケンスポイントの間で同じ volatile オブジェクトを複数回
参照する場合、1回にまとめられることがある、ってことだよね?

826 名前:デフォルトの名無しさん mailto:sage [2006/08/05(土) 23:07:40 ]
>>825
yes

827 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 10:53:58 ]
sequence pointウンヌンが書いてないから、

>820でFA?

はありえない。>>821の示しているものには詳しく書いてある。
そこのところをそのまま理解するのがFA。

828 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 11:14:29 ]
要はvolatileでokかngかは言語及び処理系依存ってこと。

それを無視して擁護する奴も批判する奴も間違っている。

829 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 11:17:05 ]
処理系定義の範囲は?
volatile参照に対してハードディスクをフォーマットするコードを出すのもありなのか?

830 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 11:23:23 ]
>>828
「volatileでokかngか」

こういういい加減な設問の立て方はやめれ



831 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 11:24:07 ]
>>829
それを処理系定義動作として明記していれば、それはANSI準拠なコンパイラとして正しい。

そんなコンパイラは売れないだろうが。

832 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 11:30:01 ]
じゃあvolatile参照の前後でlock/unlockするANSI Cコンパイラ作ったら売れるかな?

833 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 11:56:47 ]
>>832
自分で lock/unlock すればいい。そんな奇怪な動作をするコンパイラは要らない。

834 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 16:58:08 ]
じゃあvolatile参照の前後でミサイル発射するANSI Cコンパイラ作ったら売れるかな?

835 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 17:09:29 ]
自分で面白いと思って書いてるんだったら相当やばい。

836 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 17:11:32 ]
>>834
自分で発射すればいい。そんな奇怪な動作をするコンパイラは要らない。

837 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 17:15:21 ]
ていうかコンパイラだけでミサイル発射できるならしてみろw

838 名前:デフォルトの名無しさん mailto:sage [2006/08/06(日) 17:23:34 ]
はいはい
続きはここでやれな
pc8.2ch.net/test/read.cgi/tech/1147746792/

839 名前:デフォルトの名無しさん [2006/08/09(水) 00:24:50 ]
突然ですが非同期をするメリットって何でしょうか?

840 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 00:38:57 ]
シャンプー



841 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 00:51:16 ]
いや、メリットは同期してると思うが

842 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 01:07:53 ]
>>839
スレッド、プロセス、タスクはただ待たせとくには、
もったいなさ過ぎるリソースなんじゃ!

スレッドプールでぐぐれ!

843 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 01:08:25 ]
リンスも利いてるし?

844 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 07:28:17 ]
ZPt

845 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 10:19:08 ]
ちゃん・りん・しゃん、という選択肢

846 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 10:23:33 ]
>>842
スレッドプールの中のスレッドはほとんど待ってるだけだぞw

847 名前:842 mailto:sage [2006/08/09(水) 11:11:59 ]
>>846
プールとか書いたんは、俺なりの「サプライズ」や。
色んな意見があるのはわかっとるし、好きに言うたらええ。
俺はまた覚えたての言葉使って、レスしていくだけや。


848 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 11:54:36 ]
んまあ、I/Oとか凍り付いて待ってる間に他の仕事が出来るのがメリットだわね。
多くの場合、他の仕事っていうのは、ユーザに対して「やってますよ、生きてますよ」っていう
アピールをすることだったりするけどw

849 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 12:49:31 ]
>>846
馬鹿?

850 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 13:14:16 ]
だっておまい、単純なスレッドプールなら、
例えばプールにスレッドが10個あってタスクが2個だったら8つは待ってるだけじゃんか。
まあ、忙しさに合わせてスレッド数を適当に増減させるような実装も可能だけど。



851 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 13:17:55 ]
スレッドプールの利点
・タスクが200個あるけど、同時に動くのは最大10個
・スレッド生成が頻発な場合、生成のボトルネックを消す


852 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 13:24:35 ]
スレッド数の上限を制御したいときも使うわね

ていうかすみませんでしたよ。
軽い気持ちで書いただけなんですよごめんなさい。

853 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 15:55:01 ]
大したテクニックじゃない気がするんだが…。


854 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 19:20:00 ]
大したテクニックじゃないといけないのか?

855 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 20:09:24 ]
>>850
そんなの実装に依存。
議論するだけ無駄だなw

pool状態のthreadはqueueに入れないから、待つことはないって場合もあるだろうし。

856 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:11:11 ]
>>855
スレッド、プロセス、タスクはただ待たせとくには、
もったいなさ過ぎるリソースなんじゃ!

スレッドプールでぐぐれ!

857 名前:デフォルトの名無しさん mailto:sage [2006/08/09(水) 22:46:54 ]
非同期のメリットは何かと聞かれてスレッドプールでググれって言われてもアレだな

858 名前:デフォルトの名無しさん [2006/08/10(木) 00:56:12 ]
このエディタは非同期でテキスト入力してるっていわれたんだけど
じゃあ入力以外に何か処理やってるのかな?

859 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 00:57:44 ]
個人情報の流出

860 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 07:40:47 ]
仁義無きエディタ



861 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 08:46:31 ]
キー入力拾うのと、バッファに突っ込むのが非同期なんじゃね?

862 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 09:39:08 ]
>>858
GUIのエディタだと、
ウィンドウサイズ変えられるのに対応したり、
マウスで指定された範囲を反転表示したり。

863 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 10:35:09 ]
しながら同時にテキスト入力できるのか!

864 名前:デフォルトの名無しさん mailto:sage [2006/08/10(木) 10:39:46 ]
>>858
画面出力とか。

865 名前:デフォルトの名無しさん [2006/08/11(金) 22:57:19 ]
どこまでがマジレスなのか…

866 名前:デフォルトの名無しさん [2006/08/14(月) 21:40:21 ]
みんなスレッドプールって最大数超えた場合どうしてる?

867 名前:デフォルトの名無しさん mailto:sage [2006/08/16(水) 01:06:17 ]
再起動

868 名前:デフォルトの名無しさん mailto:sage [2006/08/16(水) 08:42:10 ]
海に行く

869 名前:デフォルトの名無しさん mailto:sage [2006/08/16(水) 18:56:59 ]
オレは泳がないから

870 名前:デフォルトの名無しさん mailto:sage [2006/08/18(金) 00:26:11 ]
眺めてるだけでも心和むじゃまいか



871 名前:デフォルトの名無しさん mailto:sage [2006/08/18(金) 07:41:37 ]
潜りてー
あの不要な音が聞こえない感覚が良いんじゃー

872 名前:デフォルトの名無しさん [2006/08/18(金) 14:51:42 ]
>>866
@IT:連載:.NETマルチスレッド・プログラミング入門 第4回
www.atmarkit.co.jp/fdotnet/mthread/mthread04/mthread04_01.html - 53k - キャッシュ - 関連ページ


スレッドプールのカスタマイズ
www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27266&forum=12&3 - 26k - キャッシュ - 関連ページ
[ 他、www.atmarkit.co.jp内のページ ]



スレッドプール 最大数 の検索結果 約 1,440 件中 1 - 50 件目 (0.59 秒)


873 名前:デフォルトの名無しさん mailto:sage [2006/08/18(金) 19:28:16 ]
大阪には株式会社モータープールがあり、東京には株式会社月極がある。


874 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 09:06:17 ]
MFCでマルチスレッドのプログラムを作成していますが、引数の受け渡しのところで悩んでいます

struct ThreadParams{
  int a;
  int b;
  int c;
};

BOOL MyApplicationDlg::OnInitDialog()
{
  …
  struct ThreadParams tParams;
  tParams.a = 1; tParams.b = 2; tParams.c = 3;
  AfxBeginThread(MyThread, (LPVOID)&tParams, THREAD_PRIORITY_NORMAL);
  return TRUE;
}

UINT MyApplicationDlg::MyThread(void * param)
{
  struct ThreadParams tParams = (struct ThreadParams)(*param); ←ここで既に呼び出し元のtParamsが消えているかも?
  /* tParamsを使っていろいろ処理 */
  return 0;
}

上のようなコードを書いたのですが、OnInitDialog中のtParams変数のスコープは関数内だけなので
MyThread関数でtParamsを受け取ろうとしたときには既に消えている可能性があるのではないかと思いました。
こういう場合には呼び出し元で new してスレッドの方で delete するとかで対処するのでしょうか?
他に何かよい方法があればアドバイスをお願いします。

875 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 09:33:15 ]
MyThread()とダイアログクラスの結びつきが強いのなら、クラスメンバにしておけばいいんでない?
要は、スレッドよりも長寿命ならいいわけだから。
#ダイアログクラスよりもスレッドの方が長寿ならこの手は使えないのは当然だけど。

876 名前:874 mailto:sage [2006/08/26(土) 10:20:36 ]
そうですね。ぐぐって探してみましたがクラスメンバにしているサンプルがありました
とりあえずこの方法でやってみます。ありがとうございました

877 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 10:26:12 ]
>>874
あんたの心配は正しい。

領域を渡して後はスレッド側でよろしことする以外にも...

・スレッド側で (コピーしておくとして) そのパラメータを
 使わなくなるまで親を待たせる。

・領域を静的に確保する。

・スレッドが起動してからパイプとかでパラメータをもらう。

等等。個人的には new / delete を使うことが多い。

878 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 19:08:33 ]
volatileですべて解決します。

グローバル変数にvolatile属性を付けて置く。

これ最強。


879 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 19:17:49 ]
>>878
 >>877
 >・領域を静的に確保する。

880 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 20:26:54 ]
何でvolatileネタって流行ってるの?
とくに引っ張って面白いネタとも思えないけど



881 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 21:25:02 ]
sizeof(int)以下ならvolatileでいいですよね?
排他は重いからやりたくないんですが・・・

という馬鹿が一時期沸いた

882 名前:デフォルトの名無しさん mailto:sage [2006/08/26(土) 21:28:54 ]
すごいな
全く意味のわからん質問だ

883 名前:デフォルトの名無しさん mailto:sage [2006/08/27(日) 16:59:50 ]
マルチスレッドなんか使わなければ解決

884 名前:デフォルトの名無しさん mailto:sage [2006/08/27(日) 19:58:38 ]
>>877
スレッドを越えてのnew / deleteは止めとけ。
つーか、調べると分かるが、状況によって手痛いしっぺ返しを喰らうぞ。


885 名前:デフォルトの名無しさん mailto:sage [2006/08/27(日) 21:05:30 ]
アホ発見 >>884

状況を具体的に説明してみろよ

886 名前:デフォルトの名無しさん mailto:sage [2006/08/27(日) 21:34:42 ]
>>884
それは874に宛てるべき内容だ。

呼ぶ側がdeleteするか、呼ばれた側がdeleteするかは統一するべきだとは思う。
呼ばれた側がdeleteする場合は、浅いコピーをして使い回す場合に対応できないからオススメできない。

887 名前:デフォルトの名無しさん mailto:sage [2006/08/27(日) 23:06:55 ]
>>886
> 呼ばれた側がdeleteする場合は、浅いコピーをして使い回す場合に
> 対応できないからオススメできない。

kwsk

888 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 00:21:30 ]
シャローコピーで参照を共用してる場合
データレースが起きるよヤバイよって事じゃないの?

そんなもん別スレッドに渡すなよと思うけど

889 名前:888 mailto:sage [2006/08/28(月) 00:23:33 ]
なんか違うな
忘れてくれ

890 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 00:41:46 ]
しったかぶりっこ



891 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 01:49:18 ]
参照ってもスレッドに渡す前に参照カウント1アゲるだろ

892 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 01:50:45 ]
ぶるぶるぶりっこ

893 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 02:58:49 ]
一体何の話をしてるのだろう?

894 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 05:08:03 ]
ぶりっ子ロックンロール / 紅麗威甦

895 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 20:39:11 ]
環境はWindowsです。
メインスレッドで生成されたWindowから、別スレッドを起動します。
このスレッドは、ファイルを1行づつ読み、
vector<string>に50件溜まったら、Windowへ通知します。
とりあえず下のような感じで組んだのですが、
Windowsが閉じられた場合、このスレッドを破棄しないといけません。
もしスレッドを破棄したらNetFileReaderのオブジェクトって、
解放されないのですよね。
こういうプログラムって、どうやって組むのが良いでしょう?

static vector<string> text;

void NetwordThread::execute(void* pData) {
 MyWindow* win = (MyWindow*)pData;

 NetFileReader* reader = new NetFileReader("hoge.txt");
 string* line;
 while ((line = reader->readLine()) != NULL) {
  text.push_back(*line);
  if (text.size() > 50) {
   SendMessage(win->m_hWnd, WM_MY_MESSAGE, NULL, (LPARAM)&text);
   text.clear();
   Sleep(10);
 }
 SendMessage(win->m_hWnd, WM_MY_MESSAGE, NULL, (LPARAM)&text);
text.clear();

 _endthread();
}


896 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 21:25:26 ]
中断フラグを作って、メイン側で Window を閉じる時に
フラグを On にする。

スレッド側は中断フラグを一行毎にチェックしてて、
On になったら、速やかに終了する。

通常のディスクファイル相手ならこれでいいと思う。

ネットワークファイルとかで一行の読み出しにすごく時
間がかかる場合があるならその読み出し処理自体を中断
する必要があると思う。

897 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 21:52:15 ]
ていうか、「Windowが閉じられたら」とか「スレッドを破棄」とか書いてるけど
普通は、閉じるボタンが押されたら、フラグなりイベントなりでスレッドに対して終了を通知して
ワーカースレッドは自分で後始末をしてから終了する、
GUIスレッドはワーカースレッドが終了するまで待機する
っていうふうに作るのが普通だろ。

898 名前:895 mailto:sage [2006/08/28(月) 21:54:13 ]
どもです。
中断フラグをONするメソッド作って、中はMutexで排他処理、
スレッドのexecute()の方はSendMessage()をMutexで排他処理
しておけば、1行ごとにチェックまではしなくてよいかな?
あと、スレッドの中でSleep()呼ばないと、このスレッドに完全に制御が移ってしまい、
スレッドが終了するまでWindowが固まってしまいます。
これはそういうもんでしょうか?
マルチスレッドって、どこで処理が割り込むかわからないものだと思っていたのですが。

899 名前:895 mailto:sage [2006/08/28(月) 21:55:29 ]
>>897
書き込み中にレスが。
ええ、その「普通はこうだ」ってのが聞きたかったんです。
なにぶん素人なのもので・・・

900 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 22:05:09 ]
固まらなねーよ。
プライオリティとかいじってなきゃな。



901 名前:895 mailto:sage [2006/08/28(月) 22:25:55 ]
_beginthread()呼んでるだけで、プライオリティはいじってないですね。
ActiveX内で、やってるからかなぁ。

902 名前:デフォルトの名無しさん mailto:sage [2006/08/28(月) 23:06:40 ]
>>895
>解放されないのですよね。
そもそも、なんで new で割り当ててんの?






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

前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