Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка использования WaitForMultipleObjects 
V
    Опции темы
Michrutka
Дата 2.6.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Здравствуйте, граждане форумчане!
есть консольное приложение, в кот генерится заданное кол-во потоков, выполняющих одну и ту же мат функцию.
для синхронизации использую WaitForMultipleObjects, то есть жду пока ВСЕ потоки завершат свою работу и потом уже вывожу результаты.
проблема возникает как раз в WaitForMultipleObjects - он возвращает WAIT_FAILED с ошибкой 87: Параметр задан неверно.
причем ошибка возникает при числе потоков > 65.
Подскажите, пожалуйста, в чем может быть ошибка??
Может это потому, что потоки отрабатывают слишком быстро и _beginthreadex возвращает неверный хандл? что-то такое в MSDN было написано.
но создание остановленного потока (CREATE_SUSPENDED) и последующий запуск не помогает.

привожу код:
функция main
Код

int _tmain(int argc, _TCHAR* argv[])
{
    char Qchar[255];
    do
    {
        int iCountExperiments=0;
        int iBeginCountCopy=0;
        int iCountIter=0;
        double dBorder=0.5;
        string fileName = "Test.txt";

        /***********************************
        ********Input parameters************
        ***********************************/
        ...

        /***********************************
        **************Work Code*************
        ***********************************/

        vector<PMYDATA> pDataArray;
        vector<LocalThread*>Threads;
        vector<HANDLE> hThreadArray; 

        // Create MAX_THREADS worker threads.

        for( int i=0; i < iCountExperiments; i++ )
        {
            // Allocate memory for thread data.
            PMYDATA MyObj = new MYDATA(iCountIter,iBeginCountCopy,dBorder);
            pDataArray.push_back(MyObj);
            MyObj->beginNumOfCopy = iBeginCountCopy;
            MyObj->countIter = iCountIter;

            // Allocate memory for threads.
            LocalThread* ThObj = new LocalThread(MyObj,i);
            Threads.push_back(ThObj);
            
            //If can't generate thread
            if (ThObj == NULL) 
            {
               ErrorHandler(TEXT("CreateThread"));
               ExitProcess(3);
            }
            //If all is good, we save the thread's Handle
            hThreadArray.push_back(ThObj->Get_Handle());

        } // End of main thread creation loop.
        if(iCountExperiments != 0)
        {
            // Wait until all threads have terminated.
            DWORD dw = WaitForMultipleObjects(iCountExperiments, &hThreadArray[0], TRUE, INFINITE);
            switch(dw)
            {
            case WAIT_FAILED:
                {
                    ErrorHandler(TEXT("WaitForMultipleObjects"));
                    ExitProcess(3);
                }
            }

            /***********************************
            **************Out results***********
            ***********************************/
                        ...

            // Close all thread handles and free memory allocations.
            for(int i=0; i < iCountExperiments; i++)
            {
                if(pDataArray[i]!=NULL)
                    delete pDataArray[i];
                if(Threads[i]!=NULL)
                    delete Threads[i];
            }
            
                        ...
        }    
    }
    while((Qchar[0] != 'q')&&(Qchar[0] != 'Q'));
    return 0;
}

Класс обертка для потоков
Код

//h файл
class LocalThread
{
private:
    HANDLE hdlThread;
    PMYDATA pParameters;
    DWORD   dwThreadIdArray;
public:
    LocalThread(PMYDATA param, const int number);
    ~LocalThread(void);
    HANDLE Get_Handle();
    DWORD Get_ThreadID();
    PMYDATA Get_Parameters();
};

//cpp файл
LocalThread::LocalThread(PMYDATA param,const int number)
:pParameters(param)
{
    param->timeBegin = clock();
    param->timeEnd = clock();
    //init a new random generator
    srand ( number );
    // Create the thread to begin execution on its own.
    // поток создается и получает свой ид - переменная hdlThread
    hdlThread = (HANDLE)_beginthreadex( NULL, 0, &MyThreadFunction, param, 0, NULL); 
}

LocalThread::~LocalThread(void)// функция уничтожает поток
{
    CloseHandle(hdlThread);
}

HANDLE LocalThread::Get_Handle()
{
    return hdlThread;
}
DWORD LocalThread::Get_ThreadID()
{
    return dwThreadIdArray;
}
PMYDATA LocalThread::Get_Parameters()
{
    return pParameters;
}


Описание структуры - переменных
Код

typedef struct MData {
        ...
    MData(int iter, int begin, double border);
} MYDATA, *PMYDATA;


Фнкция кот, вызывается в потоке
Код

unsigned int _stdcall MyThreadFunction( LPVOID lpParam ) 
{ 
    PMYDATA pDataArray;

    pDataArray = (PMYDATA)lpParam; // указатель на входные параметры

    ...

    return 0; 
} 


Это сообщение отредактировал(а) Michrutka - 2.6.2010, 11:38
PM MAIL   Вверх
Dem_max
Дата 2.6.2010, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

причем ошибка возникает при числе потоков > 65.


Функция WaitForMultipleObjects не может ожидать более 64 потоков.

Это сообщение отредактировал(а) Dem_max - 2.6.2010, 12:03


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Michrutka
Дата 2.6.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



Dem_max, Спасибо!

вот те раз.
а какой тогда выход?
задача - одновременно хотя бы 1000-2000 потоков.
разбивать по блокам в 64 штуки и отслеживать все эти блоки??
или есть уже придуманный велосипед?

PM MAIL   Вверх
jonie
Дата 2.6.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Michrutka, в бусте надо посмотреть, там уже есть пулы готовые...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Dem_max
Дата 2.6.2010, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Да разбивать на блоки
В итоге этот велосипед называется "пул потоков"
Велосипедов в инете много.

Есть мелкософтовские функции читай тут http://msdn.microsoft.com/en-us/library/ms...0(v=VS.85).aspx

Это сообщение отредактировал(а) Dem_max - 2.6.2010, 12:14


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Michrutka
Дата 2.6.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.2.2008

Репутация: нет
Всего: нет



jonie, 
Dem_max, 
Понял. спасибо большое. пошел копать в этом направлении
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.