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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

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

Здравствуйте. При кол-ве потоков 100+ начинает некорректно работать WaitForMultipleObjects. Не пойму в чем дело.


Код:
// work11.cpp : Defines the entry point for the console application.
//

#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]={2,10,100,1000};
	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;
}

Последний раз редактировалось bazilior; 17.04.2010 в 19:44.
bazilior вне форума Ответить с цитированием
Старый 17.04.2010, 19:38   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вроде бы все нормально, правда я не использовал никогда vector<> так что могу посоветовать сделать так
Код:
HANDLE *MyThread = new HANDLE[NThread];
я извиняюсь если чего напутал, в голове уже несколько языков и не так просто сразу выдать в правильном синтаксисе, ну думаю идея ясна что я хотел сказать.

Последний раз редактировалось BOBAH13; 17.04.2010 в 19:41.
BOBAH13 вне форума Ответить с цитированием
Старый 17.04.2010, 20:15   #3
bazilior
 
Регистрация: 17.04.2010
Сообщений: 3
По умолчанию

Не, не помогает) 64 потока работает нормально, 65 уже нет.
причем если сделать:
for (int j=1;j<NThread;++j)
{
WaitForSingleObject(*(&MyThread[j]),INFINITE);
}

работает корректно для любого кол-ва потоков


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

#define MAXIMUM_WAIT_OBJECTS 64


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

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность c++, некорректно работает WaitForMultipleObjects bazilior Помощь студентам 0 17.04.2010 18:51
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