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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2013, 23:03   #1
EvaGrey
Новичок
Джуниор
 
Регистрация: 02.10.2010
Сообщений: 1
По умолчанию Многопоточность С++, VisualStudio2008

Уважаемые программисты! Передо мной стоит задача: написать программу, использую WinAPI, в которой 5 потоков генерируют случайные числа, а один поток суммирует их, не пропуская ни одного.

Пока что у меня получилось следующее:

Код:
//Генерация n  потоками случайных чисел и суммирование их отдельным  (n+1)-м потоком
#include <windows.h>
#include <stdio.h>
#include <iostream> 
#include <stdlib.h> 
#define n 2


int Rand_num (int &a, CRITICAL_SECTION &cs/*, FILE *fl_thrd, int num*/)//стартовая функция потока-генератора
{	
	//Генерируем число и записывем его в файл
	while(1)
	{
		EnterCriticalSection(&cs);
		a = rand()%100;
		LeaveCriticalSection(&cs);
	}
	return 0;
}
int Total(int *a, int &sum, CRITICAL_SECTION &cs)//стартовая функция потока-"сумматора"
{
	while(1)
	{
		for(int i = 0; i < n; i++)
		{
			EnterCriticalSection(&cs);
			sum += a[i];
			LeaveCriticalSection(&cs);
		}
	}
	return 0;
}
void main()
{
	setlocale(LC_ALL,"Russian");

	int i, *a, sum = 0; //а - матрица, каждому потоку соотвествует своя ячейка
	HANDLE *Thread; //массив потоков, генерирующих сл.числа (от 0 до n) и поток, суммирующий числа (n+1)-й
	
	Thread = new HANDLE [n+1];
	a = new int [n];

	CRITICAL_SECTION cs;
	InitializeCriticalSection(&cs);

	puts("клавиша enter: остановить вычисления, space: возобновить");

	for(i = 0; i < n+1; i++)
		if(i == n)
			Thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Total(a, sum, cs), NULL, 0, NULL);
		else
			Thread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Rand_num(a[i], cs/*, fl_thrd[i], i*/), NULL, 0, NULL);
	
	while(1)
	{
		while(1)
			if(GetAsyncKeyState(VK_RETURN)) 
				for(i = 0; i < n+1; i++)
					SuspendThread(Thread[i]);
			if(GetAsyncKeyState(VK_SPACE))
				for(i = 0; i < n+1; i++)
					ResumeThread(Thread[i]);
	}
	
	for(i = 0; i < n+1; i++)
		CloseHandle(Thread[i]);
}
Подскажите, как мне подступиться к этой задаче
EvaGrey вне форума Ответить с цитированием
Старый 01.08.2013, 11:19   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

EvaGrey

5 потоков генерируют случайные числа, а один поток суммирует их, не пропуская ни одного.

наверное как-то так:
такого старья как vs2008 у меня нет, использую 2012

Код:
#include <atlsync.h>
#include <concurrent_queue.h>
#include <iostream>
#include <future>
#include <conio.h>
#include <stdlib.h>

Concurrency::concurrent_queue<int> q;
ATL::CEvent ping(FALSE, FALSE), done(TRUE, FALSE);

class Generator
{
public:
	void operator()() const
	{
		for (size_t i = 0; i < 10; i++)
		{
			q.push(rand() % 1000);
			ping.Set();
		}
	}			
};

class Summator
{
public:
	int operator()() const
	{
		const HANDLE h[] = { ping, done };
		int sum = 0;

		do
		{
			auto res(WaitForMultipleObjects(_countof(h), h, FALSE, INFINITE));
				
			if (res == WAIT_OBJECT_0)
			{
				int i;
				while (q.try_pop(i))
					sum += i;						
			}
			else
				break;
		} while (true);

		return sum;
	}
};

int main()
{
	auto summator(std::async(Summator()));

	Concurrency::task_group gr;
	for (size_t i=0; i<5; i++)
		gr.run(Generator());
	gr.wait();

	done.Set();
	std::cout << summator.get() << std::endl;
	_getch();

	return 0;
}
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность lalilulelo Операционные системы общие вопросы 20 16.04.2012 19:33
Многопоточность t2skler Общие вопросы C/C++ 4 16.04.2012 14:24
Многопоточность alex0097 Общие вопросы Delphi 3 05.05.2011 22:46
Многопоточность Dezmont_ Общие вопросы .NET 1 06.11.2010 18:34
многопоточность @lenk@ Помощь студентам 1 26.10.2010 20:50