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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2010, 20:35   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Критические секции в Linux

Добрый день необходимо написать программу:Необходимо сформировать матрицу вещественных чисел, содержащую n строк и m столбцов, а затем найти ее сумму. Формирование строк матрицы должно выполняться параллельно n потоками. Подсчет суммы элементов также должен выполняться n параллельными потоками. Поток подсчета суммы по строке может быть запущен только тогда, когда поток формирования строки матрицы закончит свою работу. Для повышения надежности синхронизации рекомендуется потоки подсчета сумм запустить в приостановленном состоянии. Использую Linux API, вот что написала:
Код:
// project created on 27.05.2010 at 6:50
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
using namespace std;

//==========================================================================================
//			описание данных
//==========================================================================================
	const int m=3, n=5;	//ПЮГЛЕПМНЯРЭ ЛЮЯЯХБЮ m-ЯРПНЙХ, n-ЯРНКАЖШ
	float mtx[m][n];	//ЛЮРПХЖЮ
	float sum=0;
	int strNum[m];	//ЛЮЯЯХБ УПЮМЪЫХИ МНЛЕПЮ ЯРПНЙ
	int i,j;
	static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;

//=========================================================================================
//			функции
//=========================================================================================

void printMtx(float matrix[m][n])	//ОПНЖЕДСПЮ ОЕВЮРХ ЛЮРПХЖШ (ЛЮРПХЖЮ)
{
	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
			std::cout<<matrix[i][j]<<" ";
		std::cout<<"\n"; 
	}
}

void * thread_func_2(void* data)	//ТСМЙЖХЪ ОНДЯВЕРЮ ЯСЛЛШ ЩКЕЛЕМРНБ ЯРНКАЖЮ
{
	int str_num=* (int *) data;
	for(j=0;j<n;j++)
	{
		pthread_mutex_lock( &cs_mutex );
		sum+=mtx[str_num][j];
		pthread_mutex_unlock( &cs_mutex );
	}
	return 0;
}

void * thread_func_1(void* data)	//ТСМЙЖХЪ ОНДЯВЕРЮ ЯСЛЛШ ЩКЕЛЕМРНБ ЯРНКАЖЮ
{
	int str_num=* (int *) data;
	srand( (unsigned)time( NULL )+str_num );

	for (j=0;j<n;j++)
		mtx[str_num][j]=(float)(rand()%10);
	return 0;
}


int main (int argc, char *argv[])
{
	pthread_t Thread_1[m];	//ЛЮЯЯХБ СЙЮГЮРЕКЕИ ОНРНЙНБ 
	pthread_t Thread_2[m];	//ЛЮЯЯХБ СЙЮГЮРЕКЕИ ОНРНЙНБ 
	
//======================================================================================
//		инициализация данных
//======================================================================================	
	for (i=0;i<m;i++)
		strNum[i]=i;

	
	for (j=0;j<m;j++)
	{
		int result = pthread_create(&Thread_1[j], NULL, thread_func_1, &strNum[j]);
   		if (result != 0) 
   		{
     		perror("Creating the first thread");
     		return EXIT_FAILURE;
   		}
	} 
	
	for (j=0;j<m;j++)
	{
		pthread_join(Thread_1[j],NULL);
	} 
	
	for (j=0;j<m;j++)
	{
		int result = pthread_create(&Thread_2[j], NULL, thread_func_2, &strNum[j]);
   		if (result != 0) 
   		{
     		perror("Creating the first thread");
     		return EXIT_FAILURE;
   		}
	} 
	
	for (j=0;j<m;j++)
	{
		pthread_join(Thread_2[j],NULL);
	} 
	
	printMtx(mtx);
	cout<<"\n"; 
	
	
	std::cout<<sum<<" ";
	getchar();
	
	return 0;
}
Выдает ошибка сегментирования, помогите пожалуйста
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 27.05.2010, 23:35   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Sparky Посмотреть сообщение
Код:
	float mtx[m][n];	//ЛЮРПХЖЮ
	float sum=0;
	int strNum[m];	//ЛЮЯЯХБ УПЮМЪЫХИ МНЛЕПЮ ЯРПНЙ
	int i,j;
	static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;
Sparky, думаю виной глобальная переменная j, которая иногда может принимать значения большие или равное n, сделай несколько локальных для каждой функции
eoln вне форума Ответить с цитированием
Старый 28.05.2010, 08:33   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

спасибо, пошло. А почему когда писала аналогично в Windows все работало?
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Секции PE файлов fragment Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 11.05.2010 11:50
Критические секции Altera Общие вопросы Delphi 2 25.12.2009 10:45
Секции russian-stalker Общие вопросы Delphi 5 06.09.2008 20:25
Секции в ини файле russian-stalker Общие вопросы Delphi 1 02.09.2008 19:04
Dib-секции nightstalker Win Api 3 30.01.2007 20:22