Что-то я совсем забыл С++... Нужна помощь

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Павел07
Сообщения: 1
Зарегистрирован: 16 авг 2010, 23:27

Код: Выделить всё

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <conio.h>

using namespace std;

int *Mas;
struct ParamData{
		int id;
		int Size;
		int **mas;
	};

void find_func(LPVOID Param)
{

	ParamData *tmp = (ParamData *) Param;
	int Max = tmp->mas[tmp->id][0];
	for(int i = 1; i < tmp->Size; i++)
	{
		if(tmp->mas[tmp->id][i] > Max)
			Max = tmp->mas[tmp->id][i];
	}
	Mas[tmp->id] = Max;
	cout << Max;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	cout << "Enter the array size:";
	cin >> n;
	cout << n;
	ParamData *Param = new ParamData;
	Param->Size = n;
	Param->mas = new int*[n];
	for(int i = 0; i < n; i++)
	{
		Param->mas[i] = new int[n];
		for(int j = 0; j < n; j++)
		{
			Param->mas[i][j] = (rand()%100);
			cout << Param->mas[i][j] << "  ";
		}
		cout << endl;
	}
	Mas = new int[n];

	HANDLE *Threads = new HANDLE[n];
	for(int i = 0; i < n; i++)
	{
		Param->id = i;
		Threads[i] = CreateThread(NULL,
                                                                           0,
				           (LPTHREAD_START_ROUTINE)find_func,
				           (LPVOID *)Param,
				           0,
				           0);
	}
	DWORD wait = WaitForMultipleObjects(			
					n,	
					Threads,
					false, 
					INFINITE
					);
	int tmp = Mas[0];
	for (int j = 1; j<n; j++)
                {
		cout << tmp;
		if(Mas[j]>tmp) 
			tmp = Mas[j];
                } 
	cout << endl << tmp;
	_getch();
	return 0;
}
Итак, вот код, который я написал. Приложение должно создавать потоки для поиска по строкам матрицы наибольшего их элемента, а из полученных наибольших значений выбрать также максимальное. Проблема в том, что находится только наибольшее значение последней строки, а значения для предыдущих даже и не заполняются. Есть подозрения, что я каким-то образом неправильно передаю параметры в функцию потока. У кого есть идеи? Заранее спасибо.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Возможно, проблема в том, что ты во все потоки передаешь ОДНУ И ТУ ЖЕ структуру Param, в которой, в том числе, есть поле "id процесса". Которое ты в цикле меняешь от 0 до (n-1). А кто там знает, как созданные потоки синхронизируются. Я к тому, что где гарантии, что до k-го поток дойет параметр со значением id=k, а не уже с каким-то новым, на которое основной потоу успеет сменить значение.

Наверное, надо в каждый поток передавать СВОЮ структуру. Я бы попробовал так. Убираем поле id из общей "структуры". А в "персональных" структурах объявляем поля id и указатель на общую структуру. Т.е. примерно так:

Код: Выделить всё

struct ParamData {
        int Size;
        int **mas;
    };

struct ThreadParamData{
        int id;
        ParamData * param;
    };

    HANDLE *Threads = new HANDLE[n];
   ThreadParamData * pThreadParamData = new ThreadParamData [n]
    for(int i = 0; i < n; i++)
    {
        ThreadParamData [i].id = i;
        ThreadParamData [i].ParamData = Param;
        Threads[i] = CreateThread(NULL,
                                                                           0,
                           (LPTHREAD_START_ROUTINE)find_func,
                           (LPVOID *)ThreadParamData [i],
                           0,
                           0);
    };
Ну и не забыть правила хорошего тона - в конце программы освободить delete-ом все навыделенное операторами new.
Ответить