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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 10:37   #1
Mesken
 
Регистрация: 22.04.2011
Сообщений: 7
По умолчанию Неработает поток (С++/g++)

Здравствуйте!

Написал программу по этому заданию:
Цитата:
Дана последовательность натуральных чисел a0…an-1. Создать многопоточное приложение для поиска произведения чисел a0*a1*…*an-1.
Разработать алгоритм решения задания, с учетом разделения вычислений между несколькими потоками.
Ввести защиту критических секций и обеспечить синхронизацию между процессом-родителем и дочерними потоками с помощью семафоров.
Пока не стал вводить семафоры, т.к. программа не работает должным образом.

Сама программа:
Код:
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sched.h>
#include <semaphore.h>

#define NUMSTACK 5000
													unsigned int p = 1;
char stack[4][NUMSTACK];
int *mas, n;

int potok(void *param)
{
	int i, tmp;
	int f = *(int *)param;
	for (i = f; i < n; i++)
		p *= mas[i];
	return 1 ;
}

int main()
{
	int *mas, i, n;
	int param[4];
	
	printf("\nУкажите размерность массива: ");
	scanf("%d", &n);
	
	mas = (int*)malloc(n*sizeof(int));
	srand(time(NULL));
	
	printf("Массив:\n");
	for (i = 0; i < n; i++)
	{
		mas[i] = rand()%10+1;
		printf("%d ", mas[i]);
	}
	
	if ((n/4) < 2)
		for(i = 0; i < n; i++)
			p *= mas[i];
	else 
		for (i = 0; i < 4; i++)
		{
			param[i] = i;
			char  *tostack = stack[i];
			clone(potok,(void *)(tostack + NUMSTACK -1), CLONE_VM, (void *)(param +i));
		}
	printf("\nПроизведение = %d", p);
	
	return 0;
}
Суть проблемы:
Не работает часть кода, а именно начиная с условия if ((n/4) < 2). Когда я ввожу n меньше 8, все нормально считается. А если ввести уже n 8 и больше, то программа просто ничего не вычисляет. Тупо выдает начальное значение p = 1.

Подскажите, как исправить эту ситуацию.
Если есть что сказать, пожалуйста не молчите.
Mesken вне форума Ответить с цитированием
Старый 18.04.2013, 22:00   #2
Mesken
 
Регистрация: 22.04.2011
Сообщений: 7
По умолчанию

Что никто не поможет?
Есть хоть знающие?
Mesken вне форума Ответить с цитированием
Старый 18.04.2013, 22:07   #3
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Я бы написал бы кое-что, но я сомневаюсь в своих знаниях, чтобы советовать...

блин поторопился я с ответом :D

Последний раз редактировалось Ghost3; 18.04.2013 в 22:11.
Ghost3 вне форума Ответить с цитированием
Старый 18.04.2013, 23:33   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Вероятно, просто не успевает процесс выполниться, т.к. после клона сразу же идёт вывод. Добавь ожидание завершения waitpid (ес-но надо запоминать пиды всех процессов, например, в массиве)
Ну и в самой функции считать будет не то. Первый подсчитает произведение всех, второй произведение начиная со второго числа и т.д. (и все результаты ещё перемножатся) Т.е. цикл при такой организации не нужен - нужно сразу p *= mas[f]

P.S. Ничего из выше сказанного не проверял, сказано наугад
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Неработает float..... MARTINS Помощь студентам 2 31.05.2011 12:09
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
неработает USB VVkSoft Операционные системы общие вопросы 10 12.02.2010 23:25
Помогите неработает xxxNeXxxx Помощь студентам 4 04.11.2009 23:47