[過去ログ] マルチスレッドプログラミング相談室 その4 (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1
(3): 2005/11/03(木)11:23 AAS
マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。

その1 2chスレ:tech
その2 2chスレ:tech
その3 2chスレ:tech
13
(8): 2005/11/07(月)10:54 AAS
ちょっとばっかし知恵を借りたいのだが。

Linuxでとある画像フィルタリング処理を書いている取り引き先から、
マルチスレッド化して処理を高速化してくれと依頼がきている。
2CPUマシンで動かすから1CPUマシンでは動かなくてもいいらしい。
現状では、1枚の画像に対する処理にある程度時間がかかっていて、
それを複数枚処理してから先に進むロジックなのでその部分で
複数枚分のスレッドを起こせば2CPUに適当に分散できるのではないかと考えているらしい。

そこで相談。
・2CPUマシンでマルチスレッド化はどの程度高速化が期待できるか。
#まさか理論どおり2倍になるなんて期待していないが。
省4
33
(13): [あげさせて] 2005/11/12(土)22:57 AAS
AA省
42
(3): 2005/11/13(日)00:25 AAS
>>40
> ちなみにCとAPIのみで作成しています。

へぇー fopen() と言う API がある OS もあるんだ…。

あと、>>39 は、GetFileAttributes() なんかにつ
いて言ってるんじゃないと思う。

そもそも、ファイル名返してもそのファイルを書き込み
オープンする前に他のスレッドが書き込みオープンする
かもしれない。つまり、funk() から戻った時に既に
そのファイル名のファイルが作られてるかもしれないか
ら、ファイル名なんか返しても意味がない。
46
(6): 2005/11/13(日)01:29 AAS
>>44
すまん、>>42 で大嘘書いてた。
fopen(〜, "wb") でファイルが作られるから、他のス
レッドがそのファイルを作ることはないはず。まあ、でも
わざわざファイル名を返して戻った先で再度オープンする
ならそのままファイルハンドルを返せばいいと思う。

そもそも、俺なら fopen(〜, "a") でファイルを開い
て、fgetpos() で取得したファイルポインタが 0 なら、
そのままそれを返すし、0 でなかったら違うファイル名で
再トライを繰り返すように作ると思う。
65
(6): 2005/11/20(日)17:29 AAS
セマフォをつかって、ある処理に関してロック、アンロックの処理が
したい場合、ソースは以下のようなかんじ問題ないですか?
※以下のプログラムを2つ同時に動かした場合、
セマフォの開放は1つ目のプロセスによって行われているので、
2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。
これって、基本的にはどうするといいんですかね?
196
(9): 2006/01/21(土)01:53 AAS
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)で作ったイベントに対して
SetEvent(hEvent);←TRUEがかえる
でも、その次に
WaitForSingleObject(hEvent, 0)とやってもWAIT_OBJECT_TIMEOUTがかえる。
こういうことがおきているのですがどのようなことが考えられますか?
225
(13): 2006/01/27(金)17:33 AAS
A.EXE と B.DLL があり、B.DLL が foo() という関数をエクスポートしており、
foo() は内部的に strtok 等の C ランタイム関数を呼ぶとする。

B.DLL 内部で _beginthread(ex) したスレッドの中で foo() を呼ぶのは当然問題
ないはずだけど、A.EXE が内部で CreateThread または _beginthread(ex) した
スレッドの中で B.DLL の foo() 関数を呼び出した場合、メモリリークするの?

B.DLL が DLL_THREAD_ATTACH/DETACH できちんとスレッドごとの初期化・後始末
をしていれば大丈夫そうな気がするんだけど、VC とか BC とかの C ランタイム
ライブラリはこの辺どうなってるんだろう。
235
(6): 225 2006/01/28(土)14:57 AAS
>>234 の続き
1.A.EXE: BCB5 で作成、B.DLL: VC6 libcmt.lib で作成
2.A.EXE: BCB5 で作成、B.DLL: VC6 msvcrt.lib で作成
3.A.EXE: BCB5 で作成、B.DLL: BCB5 で作成

結果:
1:DllMain で DisableThreadLibraryCalls を呼ぶとメモリリークする
  (test を呼ぶ度にメモリ使用量が増える)
  DllMain で DisableThreadLibraryCalls を呼ばなければメモリリークしない
  (test を何回呼んでもメモリ使用量は変わらない)
2:DllMain で DisableThreadLibraryCalls を呼んでも呼ばなくてもメモリリークしない
省8
256
(11): 2006/01/30(月)17:17 AAS
マルチスレッドでプログラムを作っているのですが、VisualC++6.0(SP6)でデバッグすると
しばらくするとフリーズしてしまいます。
フリーズというのは、VC++と実行しているEXEがまったく応答しなくなり、
さらにOSの反応がほとんどなくなる感じです。
ほとんどというのは、Alt+Tabぐらいは効くのですが、タスクマネージャーも起動せず
他のアプリも、しばらく動くのですがじきに応答がなくなります。
デバッグではなく、ただEXEを実行した場合は普通です。
OSはWindowsXPHome SP2で、まあ標準的な環境だと思います。
1つ怪しいのといえば、NortonAntiVirusですが、これに関しては
ほぼインストールしたてのWin2000SP4のマシンでやっても同じような現象が
省2
284
(10): 2006/02/11(土)07:40 AAS
もう二日も考え込んでるんですが解決しないんで質問です。(うう、マジで目と頭が痛い…。)
基本的に生産者消費者問題なんですが
Aが物を作るとBに渡し、Bが物を作るとCに渡し、Cが物を作るとDに渡す、というように
複数の生産者/消費者のベルトコンベヤーでの流れ作業を想定しています。
で以下のように組んでみたんですが、
今度はB自身が消費したことをB自身に知らせなくてはならなくてこんがらがってきました。

public class Main
{
public static void main(String args[]) {
ConveyerBelt stationAB = new ConveyerBelt();
省18
289
(4): 2006/02/11(土)12:09 AAS
各々理由を書いてね。

> 今度はB自身が消費したことをB自身に知らせなくては
> ならなくて

> ちなみにセマフォは「なし」の方向でお願いします。
290
(3): 2006/02/11(土)18:57 AAS
>>289
正確厨、規格厨、口先厨の予感。現状提示されている情報から
回答が思いつかなければ、その問題に対する類似性や経験則
など思い当たるところが無いっつーことだろ。

全部の情報が分からないとコミュニケーションできないような
応用力無しやつは黙ってろ
308
(3): 2006/02/12(日)12:57 AAS
なんで、consumerBとproducerBが別オブジェクトなわけ?
ふつうは入口と出口のある1つのオブジェクトとして考えるでそ?
322
(3): 2006/02/14(火)13:30 AAS
久し振りに来てみたが、相変わらず、このスレは知ったか馬鹿が多いな。
とりあえず>>288>>310>>311あたりの馬鹿どもはこのスレいても邪魔だから消えろ。
もう>>284はいないと思うが俺なら

public class Main
{
public static void main(String args[]) {
ConveyerBelt NULL = new ConveyerBelt();
ConveyerBelt stationAB = new ConveyerBelt();
ConveyerBelt stationBC = new ConveyerBelt();
ConveyerBelt stationCD = new ConveyerBelt();
省11
408
(4): 2006/03/16(木)22:30 AAS
Windows Threadについて質問です。擬似コードですが、
Thread[] threads = getAllThread();
foreach (Thread t; threads) {
t.suspend();
}
このような全てのスレッドを止めるためのループがあるとします。
このループ中では、既に止められているスレッドと、
これから止められる予定のスレッドがあると思うのですが、
これから止められる予定スレッドが、既に止めたスレッドを再開(resume)するため、
このループでは全てのスレッドを止められない、ということは起こりえるのでしょうか?
467
(4): 2006/05/23(火)16:38 AAS
Pentium XE 840 ではHyper-Threading有効となっているので、
デュアルコア×2スレッドで4スレッド同時処理ができますが、
HTの論理コアを判別する方法はないでしょうか?

SetThreadAffinityMask() を利用して1つのコアを
スレッドに対して独占的に割り当てた場合にHT論理コアだと
処理速度向上が余り望めません。

もしくはWindowsでCPU番号(コア番号)が
どのように割り当てられるかご存知ないですか?

単純に↓とか?
CPU1-Core1-Main
省8
506
(4): 2006/06/10(土)16:56 AAS
AA省
519
(3): 2006/06/12(月)18:04 AAS
>>517
それ、WaitForSingleObject で待ってない(即リターンしてる)から。
他のスレッドが所有権を持ってないので、呼び出したスレッドが即座に所有権を得ておしまい。
2度目以降の呼び出しは、呼び出したスレッドがすでに所有権を持っているので即座に完了。

他のスレッドに所有権を持たせておくか、selectとかSleepでも使うべし。
539
(7): 2006/06/24(土)21:26 AAS
Windowsで、タスク内の複数スレッド間だけで通用する、高速な同期オブジェクトって無いですかね?
なんか、どれもこれも、重そうで。
575
(3): 2006/06/29(木)15:54 AAS
それを非同期というのではないのか?
593
(8): 2006/07/05(水)10:16 AAS
Winsock、_beginthreadで起動して、
グローバル変数で終了要求するような、
簡単なスレッド書いているのですが、、、。

スレッド内でrecv()のような、
ブロックするような関数を呼びたくなりました。
これを終了するにはどうしたらよいでしょう。
609
(3): 2006/07/07(金)00:34 AAS
下の層が受信しているのにアプリが落ちたら、次に起動するときにbindErrorになる。
627
(6): 2006/07/18(火)19:03 AAS
AA省
640
(3): 2006/07/19(水)12:26 AAS
生半可な学習しないで、ファイルディスクリプタについてちゃんと勉強したら?
693
(3): 2006/07/29(土)18:15 AAS
VC++とMFCでマルチスレッドなサーバープログラムを書いています。
サーバープログラムを終了する時、ソケットが走ってるスレッドを終了させないといけませんが、
スレッドに終了を通知する手段が分かりません。
どのように終了を通知するのか教えていただけないでしょうか。

よろしくお願いします。
716
(5): 2006/08/01(火)11:20 AAS
>>711
問題ない
関数内ではスレッドの切り替えは起こらない
736
(3): 2006/08/03(木)14:38 AAS
static bool g;

if (!g && g = true) {}

この if ()の中でスレッド切り替えって起こります?
排他処理になりませんか?
779
(3): 736 2006/08/04(金)13:14 AAS
if (g = g ? false : true)

この場合でも排他にならない??
アホですまん
787
(3): 779 2006/08/04(金)14:38 AAS
リスト処理でつなげるときに排他したいけど
WinAPI使うしかないみたいですね
811
(3): 2006/08/05(土)09:44 AAS
volatile最高!!!

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

sizeof(int)以下ならlockなんて不要www
820
(3): 2006/08/05(土)16:42 AAS
そもそもCではvolatile参照の意味は処理系定義だ。
参照時にlock/unlockする処理系もありうるし、volatile参照を最適化で
削除してしまう処理系もある(マニュアルに書かれている)。

Javaのvolatileはまた違う意味を持っているし。
895
(8): 2006/08/28(月)20:39 AAS
AA省
917
(3): 2006/09/06(水)21:28 AAS
居なくなった人のプログラムを押し付けられたんだけど、
CreateThread()した後、即CloseHandle()している。
どうして即CloseHandle()するのか、
Thread関数内のExitThread()直前に呼べばいいんじゃないのか、
そもそもCloseHandle()しなくてもExitThread()するんだから要らないんじゃないのか
と思うんですが、誰も(??)
そのままにしておけばいいんでしょうか。
923
(30): 2006/09/08(金)12:38 AAS
ロックしないでグローバル変数に(intなど機械語1命令で読み書き可能な
サイズという条件で)アクセスするケースを考えます。

int a;
void thread1(){
 while(1)a=0x0000ffff;
}
void thread2(){
 while(1)a=0xffff0000;
}
void thread3(){
省4
943
(3): 923 2006/09/09(土)12:46 AAS
厳密性を完璧にするなら世の中のマシン全部で試さないといけない
じゃないという話にもなりますし、それはやはり現実味の無い話と
しては上に書いてあることと大差ありません。理論にも実装にも
ミスが無くてもおかしくなる環境は必ずあります。

一応持ってるマシンで検証プログラムを走らせましたがエラーする
ケースは一度も起きませんでした。

性能に関しては、ロック無しを1とした場合、Interlocked系で読み書き
すると5倍、CriticalSectionで排他すると200倍近い速度低下が起きます。
(テストプログラムは極端な例でしょう)
省9
957
(3): 923 2006/09/09(土)14:15 AAS
あと、失敗しない限り発言しないでください。

失敗しなければ問題ありませんので。
975
(3): 2006/09/09(土)19:25 AAS
面倒なので代入と加算とそれぞれのロックありなしの場合を
すべて同時にテストできるプログラムにしていただけませんか?
あと、レポートも不具合ありなしだけじゃなくて、使用CPU構成や
OSバージョンなども表示されると素敵ですね。
それから、ソースはここの数レス消費する貼り方せずに
外部リンク[htm]:kansai2channeler.hp.infoseek.co.jp
あたりのうpろだを使っていただくのが
協力者以外のひとに迷惑かからなくてよろしいかと思います。
983
(4): 2006/09/09(土)22:56 AAS
前々スレくらいでvolatile厨を繁殖させた者です。

この話題って、あの時のフラグ変化の検出の話題と凄く似ていると思う。
あの時は単なるフラグで、1ビットでも変化している事を検出できれば
良かったから、不必要にややこしくしそうで触れなかったんだけど。

前の時のポイントは、

1. メモリから読み込んだ値を利用(計算)した結果を書き込むのではなく、
  完全に新規な値をメモリに書き込む。
2. 更新前の古い値を他のプロセッサがキャッシュの関係で読み込んでも、
  伝搬されて更新された値を近いうちに読み込めればよい。

という前提において、
省5
988
(3): 2006/09/10(日)00:29 AAS
>>983
> という前提において、

そういう前提かどうかは明らかにされていない

>>984
> ついでに、OS依存、アーキテクチャ依存だって言う必要もないのでは?

「世に出回っている大抵のWindowsマシンでおかしくならない線」
というあいまいな線引きしかなされていない

つーかさ、
spec等から確認できることもせずに、いきなり検証コード持ち出して
「ホラ、動いてるから問題ないじゃん」
省4
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.076s