マルチスレッドプログラミング相談室 その8
- 1 :デフォルトの名無しさん:2009/09/21(月) 17:19:27
- マルチスレッドプログラミングについて語るスレ
■前スレ
マルチスレッドプログラミング相談室 その7
http://pc12.2ch.net/test/read.cgi/tech/1215253576/
■過去スレ
その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html
その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/
その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/
その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/
その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/
その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/
OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ
【OS】
【言語】
【実行環境】
【その他特記する事項】
- 175 :デフォルトの名無しさん:2009/10/16(金) 08:03:36
- 何でも鸚鵡返しすれば反論になると思ってるだろ
- 176 :デフォルトの名無しさん:2009/10/16(金) 08:04:58
- baka
- 177 :デフォルトの名無しさん:2009/10/16(金) 08:09:28
- pthread地獄 part 2
http://pc12.2ch.net/test/read.cgi/unix/1166620307/
ここへ行けばいいのに
- 178 :デフォルトの名無しさん:2009/10/17(土) 03:19:26
- /\ ┌┐ ┌┐ ___ ___
/ __ \ /\ ..||.. /\ || ___ \\ \
/ / .\ \ \ \ .||. / / ┌──┘└──、\\  ̄  ̄
/ / .\ \ \/ .||. \/ └──┐┌─ 、| |__|
/ / ┌──┐.\ \ ┌───┘└───┐ .|| ||
..\/ └┐┌┘ .\/ └───┐┌───┘ / / ||
┌┘└┐ /\ .||. /\ / / / /
└┐┌┘ / / .||. \ \ / / / /
┌─┘└─┐ \/ ..||.. \/ \/ / /
└────┘ └┘ \/
....、
....................--------、, i~゙7 r‐ッ !゙゙.! ! !
: !―――;;;;;;''''''''ゝ ,,ノ゛ ._ / ./ .,! .,! ! ! .,..............! ヽ..........-、
| |./ / .l、,`''-./ ./ ! ! | | ――ーッ .iー''''''''i |
| l'-‐゛ `゙ッ .ゝ、 .| | | ,! ./ ./ ! !
../ .,! /.,r'"\,/ .!ー′ ./ .,! . / ./ | │
.,./ ./ ,..‐" / . / / ./../ ./ .l゙
.r'"./ ゝ/゛ : ,,-'゛./ .〈 / .'|,゙,゙,,,, "
.`゛ ゙'''"
- 179 :デフォルトの名無しさん:2009/10/20(火) 15:39:31
- その “全米” はグアム島を含むのでしょうか。
- 180 :デフォルトの名無しさん:2009/10/20(火) 19:08:01
- グアム、どうなんだろ。州に昇格すればいいのに。まあ、しないだろうけど。
- 181 :デフォルトの名無しさん:2009/11/03(火) 00:02:53
- スレッドを終了させるときは_endthreadexじゃなく
そのままreturnでもいいのか?スタックの開放されない?
- 182 : ◆0uxK91AxII :2009/11/03(火) 00:28:01
- 良い。
mallocで取ってきた領域をfreeしなくて良いのと同じくらいに。
スタックとやらは、_endthreadexとは無関係。
- 183 :デフォルトの名無しさん:2009/11/03(火) 00:59:57
- freeしろよ
- 184 :デフォルトの名無しさん:2009/11/03(火) 01:16:04
- スレッドに強くないのに書き込んでみる。
ttp://msdn.microsoft.com/ja-jp/library/hw264s73(VS.80).aspx
>ただし _endthread または _endthreadex は、_beginthread や _beginthreadex の
>パラメータとして渡されたルーチンからスレッドが戻ると自動的に呼び出されます。
ってことで、returnすれば問題ないかと。
どちらかというと
>_endthread と _endthreadex によって、C++ デストラクタはスレッドで保留状態になり、呼び出されません
なので、呼ばないほうが好ましいような。
- 185 : ◆0uxK91AxII :2009/11/03(火) 01:52:01
- 182は無かった事にしてください。
んゆ。
- 186 :184:2009/11/03(火) 14:42:55
- スレッドに強い人に補強して欲しいのだけど、それとも184の認識で問題なし?
- 187 : ◆0uxK91AxII :2009/11/03(火) 17:34:11
- Microsoft Visual Studio\VC98\CRT\SRC\THREADEX.C
んゆ。
- 188 :デフォルトの名無しさん:2009/11/03(火) 17:55:09
- 問題なし
- 189 :デフォルトの名無しさん:2009/11/03(火) 22:08:15
- スレッド識別子って何なんだ?
何に使うの?
- 190 :デフォルトの名無しさん:2009/11/03(火) 22:25:48
- 殺したり、止めたり。
- 191 :デフォルトの名無しさん:2009/11/04(水) 21:43:06
- 他スレッドの変数の中身知ることってできないかな?
- 192 :デフォルトの名無しさん:2009/11/04(水) 21:55:11
- メモリ空間は共有しているので、アドレスがわかれば普通に参照できる。
- 193 :デフォルトの名無しさん:2009/11/05(木) 12:32:06
- win32のインターロックをクリティカルセクションと
同じように使ったら早くて驚いた。
両者の内部的な違い・利点・欠点てなんですかね?
- 194 :デフォルトの名無しさん:2009/11/05(木) 14:06:45
- そもそも用途が違うんじゃない?
インターロックは変数1個ぶんの更新しかできないでしょ?
インターロックを使ってクリティカルセクションと同様のものを作ることはできるだろうし、
クリティカルセクションを使ってインターロックと同様のものを作ることもできるだろうけど、
そういう話?
- 195 :デフォルトの名無しさん:2009/11/05(木) 14:31:15
- インターロック一発で出来ることならインターロックで。
- 196 :デフォルトの名無しさん:2009/11/05(木) 14:54:32
- win32のクリティカルセクションは衝突しなければインターロックと同じくらい早いんだなこれが
- 197 :デフォルトの名無しさん:2009/11/05(木) 16:01:33
- いや倍くらいは遅いだろう。
- 198 :デフォルトの名無しさん:2009/11/05(木) 16:15:02
- んだ。インターロックで済むならそれが数倍早い。
- 199 :193:2009/11/05(木) 19:29:23
- 今以下のクラスでクリティカルセクションと同じように扱ってテストしてるんだ。
class InterLock
{
private:
LONG m_Flag;
public:
void Enter()
{
while(InterlockedCompareExchange(&m_Flag,1,0)) Sleep(0);
}
void Leave()
{
InterlockedCompareExchange(&m_Flag,0,1);
}
public:
InterLock()
{
m_Flag = 0;
}
virtual ~InterLock()
{
}
};
- 200 :193:2009/11/05(木) 19:30:08
- こっちはクリティカルセクション晩
class CriticalSection
{
private:
CRITICAL_SECTION cs;
public:
void Enter()
{
EnterCriticalSection(&cs);
}
void Leave()
{
LeaveCriticalSection(&cs);
}
public:
CriticalSection()
{
InitializeCriticalSection(&cs);
}
virtual ~CriticalSection()
{
DeleteCriticalSection(&cs);
}
};
- 201 :193:2009/11/05(木) 19:43:57
- //グローバル変数
ロッククラス g_Lock;
int g_i = 0;
// 三つのスレッドで以下を走らせる
void Run()
{
for(int i=0; i<10000000; i++)
{
g_Lock.Enter();
g_i++;
g_Lock.Leave();
}
}
int main()
{
//3つのスレッドでRun()を走らせ、スレッド終了まで待機
(...省略)
cout << g_i << endl;
cout << time.result() << endl;
return 0;
}
結果
クリティカルセクション 35秒 g_i = 30000000
インターロック 5.5秒 g_i = 30000000
ロッククラス無し 0.16秒 g_i = 21203536(整合性無し)
環境 OS:win xp CPU:core2duo1.8G メモリ:3G
- 202 :デフォルトの名無しさん:2009/11/05(木) 20:42:07
- ソースまともに見てないけど、CSがもしインライン化されないなら性能的には勝てない
だろうしなぁ
まぁ、asm読めば全て分かるだろうけど
- 203 : ◆0uxK91AxII :2009/11/05(木) 23:23:50
- TryEnterCriticalSection ~ Sleepだとどうなるの、っと。
threadをCPUと1:1にbindしたらどうなるの、っと。
timesliceを変えたらどうなるの、っと。
結果は書かない方が良い。
- 204 :193:2009/11/06(金) 07:01:38
- >TryEnterCriticalSection ~ Sleepだとどうなるの、っと。
これだけやってみた。
上記のテストだとインターロックとの差は0.5秒内、
つまりほとんど差がなくなった
- 205 :デフォルトの名無しさん:2009/11/06(金) 13:00:12
- プロセッサ数が2以上ならSpinWaitにしたらどうなる?
あとインターロックのIncrementでダイレクトアップデートにしたらどうなる?
- 206 : ◆0uxK91AxII :2009/11/06(金) 20:26:47
- 違うネタだけど。
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#define THREADS 64
#define LOOPS 123456789
struct SData { LARGE_INTEGER m_cntBegin; LARGE_INTEGER m_cntEnd;};
DWORD WINAPI thread(LPVOID pArg);
int __cdecl cmpForSort(const void *pArg0, const void *pArg1);
int _tmain()
{
int i; HANDLE ahThread[THREADS]; SData aData[THREADS];
LARGE_INTEGER diff;
for (i=0; i<THREADS; i++)
ahThread[i] = CreateThread(NULL, 0, thread, &aData[i], 0, NULL);
WaitForMultipleObjects(THREADS, ahThread, TRUE, INFINITE);
qsort(aData, THREADS, sizeof SData, cmpForSort);
for (i=0; i<THREADS; i++)
{
CloseHandle(ahThread[i]);
diff.QuadPart = 0<i? aData[i].m_cntBegin.QuadPart - aData[i-1].m_cntBegin.QuadPart: 0;
_tprintf(_T("thread: %d, diffBegin: %I64d, clock: %I64d\n"), i, diff.QuadPart, aData[i].m_cntEnd.QuadPart-aData[i].m_cntBegin.QuadPart);
}
return 0;
}
- 207 : ◆0uxK91AxII :2009/11/06(金) 20:28:49
- DWORD WINAPI thread(LPVOID pArg)
{
SData *pData; DWORD value; float sum;
pData = (SData *)pArg;
QueryPerformanceCounter(&pData->m_cntBegin);
__asm
{
mov ecx, LOOPS
fldz
LOOP_:
fadd QWORD PTR value
dec ecx
jnz LOOP_
fstp DWORD PTR sum
}
QueryPerformanceCounter(&pData->m_cntEnd);
return 0;
}
int __cdecl cmpForSort(const void *pArg0, const void *pArg1)
{
LARGE_INTEGER diff;
diff.QuadPart = ((SData *)pArg0)->m_cntBegin.QuadPart - ((SData *)pArg1)->m_cntBegin.QuadPart;
if (0 > diff.QuadPart) return -1;
if (0 < diff.QuadPart) return 1;
return 0;
}
- 208 : ◆0uxK91AxII :2009/11/06(金) 20:37:44
- 同じ処理なのに所要時間がブレるとか、
先に開始したthreadよりも、後から開始した方が早く処理を終えるとか。
そういうのが起こりうる。
computer gameでmulti threadの利用に消極的な理由の一つだと思う。
- 209 :193:2009/11/06(金) 23:12:33
- >>205
>インターロックのIncrementでダイレクトアップデートにしたらどうなる?
1.3秒だった
>SpinWait
これC#じゃん
- 210 :デフォルトの名無しさん:2009/11/07(土) 01:40:37
- スピン待機はC#限定じゃなく一般的な概念だ
- 211 :デフォルトの名無しさん:2009/11/07(土) 09:40:03
- スピンすると余計遅くなりそうだな。
一般的な使用状況に比べて処理と競合がタイトすぎるせいかな多分。
- 212 :デフォルトの名無しさん:2009/11/07(土) 09:45:49
- ああつまり3スレッド同時じゃなくて1スレッドで3回繰り返した方が速いとかっていう状態ね。
- 213 :デフォルトの名無しさん:2009/11/07(土) 17:33:40
- あーいやいや、これだとちょっと書き方がおかしいな…まあいいや
- 214 :193:2009/11/07(土) 19:49:07
- スピンロックは信頼性がないという話を聞いたような。
さて上記のベンチですが、1スレッドで3回繰り返したほうがずっと早いです。
衝突したときに別の処理をせずに待つ場合はシングルスレッドにした方がいいかも。
- 215 :デフォルトの名無しさん:2009/11/07(土) 20:02:47
- スピンロックに信頼性が無かったらどうすんだよw
全然仕組みとか分かってなくて使ってる匂いがぷんぷんするな
- 216 :デフォルトの名無しさん:2009/11/07(土) 20:03:53
- スピンロックとスピンウェイトは基本的に別物です。
- 217 :デフォルトの名無しさん:2009/11/08(日) 00:12:02
- それと信頼性に何の関係が?
- 218 :デフォルトの名無しさん:2009/11/08(日) 02:55:49
- スピン待ちの話をされてスピンロックどうこうと返すのがおかしい
- 219 :デフォルトの名無しさん:2009/11/08(日) 10:06:21
- 上の人じゃないけど、スピンロックはスピンウエイトを使ってやってるかとおもてたよ(´・ω・`)
- 220 : ◆0uxK91AxII :2009/11/08(日) 12:45:22
- spinlockでlockできる保証は無いね。
偶然上手く動いているだけ。
- 221 :デフォルトの名無しさん:2009/11/09(月) 01:48:53
- ◆0uxK91AxIIで検索したら、NGしてもいいくらいトンチンカンな奴だな
- 222 :デフォルトの名無しさん:2009/11/10(火) 14:27:27
- トリップ付けるような奴だもの。
- 223 :デフォルトの名無しさん:2009/11/10(火) 20:06:21
- トンチンカンなんて久々に見た
おやつあげないわよ
- 224 :デフォルトの名無しさん:2009/11/11(水) 09:14:41
- 抜作先生の方がまだ新しいな。
74 KB
[ 2ちゃんねる 3億PV/日をささえる レンタルサーバー \877/2TB/100Mbps]
■ おすすめ2ちゃんねる 開発中。。。 by FOX ★
このスレを見ている人はこんなスレも見ています。(ver 0.20)
会社で使えない奴、それはワタシ/アイツ [プログラマー]
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 05.0.7.8 2008/11/13 アクチョン仮面 ★
FOX ★ DSO(Dynamic Shared Object)