マルチスレッドプログラム
いつもお世話になっております。
今回はマルチスレッドプログラムについてお聞きしたいです。
マルチコアCPUを使ってたとえば下記のようなことをしたいときに
for (int i = 0; i < 1000000; i++)
{
sum += i;
}
このまま計算するよりもいくつかスレッドを作って、計算量を分散させてから最後に足してやるほうが早いと思いまして、
現在Core2Quadが手元にありましたのでスレッドを4つ作って
スレッド1で0から250000まで
スレッド2で250001から500000まで
スレッド3と4も同様にして実際にやってみたのですが
スレッドなしの状態よりも倍くらい時間がかかってしまうようになってしまいました。
計算結果は同じになり、CPU使用率もシングル時が25%、マルチ時が100%になっているので意図したようにはできていると思います。
GetProcessAffinityMaskを使って、各スレッドにひとつづつコアを割り当てても同様でした。
実際に時間が4分の1に近くなると思っていたのですが2倍かかってしまったので不思議です。
どなたか上記のことを思惑通りに動かせそうな方法をご存知の方はご教授願います。
プログラムは全部は無理ですが重要そうなところは下記のとおりです。
スレッド作成部分
{
DWORD dwStart = ::timeGetTime();
_thread_handle[0] = (HANDLE)::_beginthreadex(NULL, 0, thread_first, NULL, CREATE_SUSPENDED, &_thread_first_id);
_thread_handle[1] = (HANDLE)::_beginthreadex(NULL, 0, thread_second, NULL, CREATE_SUSPENDED, &_thread_second_id);
_thread_handle[2] = (HANDLE)::_beginthreadex(NULL, 0, thread_third, NULL, CREATE_SUSPENDED, &_thread_third_id);
_thread_handle[3] = (HANDLE)::_beginthreadex(NULL, 0, thread_forth, NULL, CREATE_SUSPENDED, &_thread_forth_id);
for (int num = 0; num < 4; num++)
{
::ResumeThread(_thread_handle[num]);
}
::WaitForMultipleObjects(4, _thread_handle, TRUE, INFINITE);
for (num = 0; num < 4; num++)
{
::CloseHandle(_thread_handle[num]);
}
DWORD dwEnd = ::timeGetTime();
}
各スレッド部分
{
HANDLE hCurrent = ::GetCurrentProcess();
DWORD pamask, samask, patmp = 0;
int nRet = ::SetProcessAffinityMask(hCurrent, 0x0001);
::GetProcessAffinityMask(hCurrent, &pamask, &samask);
DWORD dwStart = ::timeGetTime();
_result1 = 0;
for (int multi = 0; multi < _multi; multi++)
{
for (DWORD i = 0; i < 100000/4; i++)
{
_result1 += i;
}
}
DWORD dwEnd = ::timeGetTime();
time1 = dwEnd - dwStart;
::_endthread();
return 0;
}
開発環境は
WindowsXP SP3
VisualStudio6.0 ATL/WTLです。
お礼
回答ありがとうございます。 参考になります。 プロセスが終了するときに全て閉じられるのならそれほど気にしなくても大丈夫なんですね。