Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2010, 18:51   #1
bazilior
 
Регистрация: 17.04.2010
Сообщений: 3
По умолчанию Многопоточность c++, некорректно работает WaitForMultipleObjects

Здравствуйте. Задание посчитать интеграл с помощью ф-лы прямоугольников разным количеством потоков. При кол-ве потоков ~100+ WaitForMultipleObjects начинает работать неправильно - ждет 4-5 и идет дальше. Не могу понять в чем ошибка. Подскажите пожалуйста.

Код:
#include "stdafx.h"


struct ThreadParam
{
	int N;
	double dx;
	int IntNum;
	double a;
	double b;
	double SUM;
};

double myFun( double x)
{
	const double PI = 3.141592653589793;
	double y=PI/2*sin(PI/2*x);
	return y;
}

double intSum(int i, double dx)
{
	double s=myFun((i+.5)*dx)*dx;
	return s;
}

DWORD WINAPI ThreadFunction(LPVOID tParam)
{
	ThreadParam *TP=(ThreadParam *)tParam;
	double low=TP->IntNum*(TP->b - TP->a)/TP->N;
	double high=(TP->IntNum+1)*(TP->b - TP->a)/TP->N;
	int NInt = (high-low)/TP->dx ;

	for (int j=0;j<NInt;++j)
	{
		TP->SUM += myFun(low+(j+.5)*TP->dx )*TP->dx ;
	}

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{

	int i;
	int T[4]={100,110,1100,1200};
	const double dx = 0.0000001;
	const double a = 0.0;
	const double b = 20.0;
	int NThread ;
	double SUM=0;
	double TSUM=0;


	for (i=0;i<(b-a)/dx;++i)
	{
		SUM+=intSum(i,dx);
	}

	cout<<"Integral "<<SUM<<endl;

	for (int f=0;f<4;++f)
	{
		NThread=T[f];
	
		vector<ThreadParam*>   tPar (NThread);
        vector<HANDLE> MyThread (NThread);

        for (i=0;i<NThread;++i)
        {
            tPar[i] = new ThreadParam();
            tPar[i]->N =NThread;
            tPar[i]->a =a;
            tPar[i]->dx =dx;
            tPar[i]->b=b;
            tPar[i]->IntNum = i;
            tPar[i]->SUM =0;

        }

        for (i=0;i<NThread;++i)
        {
            MyThread[i]=CreateThread(NULL, 0, & ThreadFunction, tPar[i], 0, NULL);
        }

		WaitForMultipleObjects(NThread, &MyThread[0], 1 , INFINITE);

		for(i=0;i<NThread;++i)
		{
			TSUM += tPar[i]->SUM;
			CloseHandle( MyThread[i] );
		}

		cout<<"\n\n\nThreads "<< NThread << endl;
		cout<<"Integral "<<TSUM<<endl;
		TSUM=0;
		
	}
	getchar();

	return 0;
}

Разобрался))

#define MAXIMUM_WAIT_OBJECTS 64


Надо на блоки по 64 делить.

Последний раз редактировалось bazilior; 17.04.2010 в 22:43.
bazilior вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
float в ие-6 работает некорректно cratte HTML и CSS 3 17.02.2010 08:50
Некорректно работает запрос Arkuz БД в Delphi 9 20.08.2009 07:04
Некорректно работает запрос zulu80 БД в Delphi 10 16.02.2009 13:35
IdHTTP1 некорректно работает nike-p Работа с сетью в Delphi 9 23.07.2008 23:13
скажите почему работает некорректно pimiento Общие вопросы C/C++ 6 29.05.2008 17:21