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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2010, 19:36   #1
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию Использование событий в Linux

Добрый вечер! Необходимо написать программу:
Написать программу выполняющую сортировку массива из n вещественных чисел методом обмена. Каждый проход сортировки запустить в отдельном потоке. Поток следующего прохода активизировать только тогда, когда предыдущий проход обработал половину массива. Использую Linux APi, вот что накидала:
Код:
// project created on 28.05.2010 at 18:53
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
using namespace std;
//================================================================================
//			описание данных
//================================================================================
	const int n=10;	//ПЮГЛЕПМНЯРЭ ЛЮЯЯХБЮ
	//описание события
	int arr[n];	//ЛЮЯЯХБ ЙНРНПШИ МСФМН НРЯНПРХПНБЮРЭ
	int col_num[n-1];	//ЛЮЯЯХБ ЬЮЦНБ


//===============================================================================
//		функции
//===============================================================================
void print_arr(int mas[n])	//ОПНЖЕДСПЮ ОЕВЮРХ ЛЮЯЯХБЮ
{
	for(int i=0;i<n;i++)
		std::cout<<mas[i]<<" ";
	std::cout<<"\n"; 
}


void * thread_func(void* data)	//ТСМЙЖХЪ ОНДЯВЕРЮ ЯСЛЛШ ЩКЕЛЕМРНБ ЯРНКАЖЮ
{
	int col=* (int *) data;
	//WaitForSingleObject(hEventEnter,INFINITE);
	//ResetEvent(hEventEnter);        
	for (int j=0; j<n; j++)
	{
	
        if (arr[j] > arr[j+1]) 
		{

			int temp=arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=temp;
		}
		//if (((n+col)/2)==j) SetEvent(hEventEnter);
	}
	return 0;
}

//================================================================================
//			главная программа
//================================================================================
int main (int argc, char *argv[])
{
//================================================================================
//		описание и инициализация данных
//================================================================================
	//hEventEnter = CreateEvent(NULL,true,true,NULL);	//ЯНАШРХЕ ОПНХГНЬКН
	for(int i=0;i<n;i++)
		arr[i]=(int)(rand()%20);
	print_arr(arr);
	for(int i=0;i<n-1;i++)
		col_num[i]=i;
	pthread_t Thread[n-1];	
//================================================================================
//		работа с потоками и событиями
//================================================================================
	
	for (int j=0;j<n-1;j++)
	{
		int result = pthread_create(&Thread[j], NULL, thread_func, &col_num[j]);
   		if (result != 0) 
   		{
     		perror("Creating the first thread");
     		return EXIT_FAILURE;
   		}
	} 
	
	for (int j=0;j<n-1;j++)
		pthread_join(Thread[j],NULL);
	
	//CloseHandle(hEventEnter);
	print_arr(arr);
	getchar();

		
	return 0;
}
Но не знаю как прикруить события, в комментах есть строки которые использовала в этой программе когда писала ее использую WIN API. Помогите пожалуйста
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 29.05.2010, 13:18   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Сам не так давно начал программировать под Линуксом, но вот поэксперементировал немного с условными переменными (condition variables) и добавил мьютексы чтоб конфликтов не было.
Код:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
using namespace std;
//================================================================================
//			описание данных
//================================================================================
	const int n=10;	//ПЮГЛЕПМНЯРЭ ЛЮЯЯХБЮ
	//описание события
	int arr[n];	//ЛЮЯЯХБ ЙНРНПШИ МСФМН НРЯНПРХПНБЮРЭ
	int col_num[n-1];	//ЛЮЯЯХБ ЬЮЦНБ
        //не уверен точно нужен ли массив или достаточно одного экземпляра
	pthread_mutex_t cs_mutex[n-1] = {PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,
	PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER,PTHREAD_MUTEX_INITIALIZER};
	pthread_cond_t cs[n-1] = {PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER
	,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER};
	int cond[n];

//===============================================================================
//		функции
//===============================================================================
void print_arr(int mas[n])	//ОПНЖЕДСПЮ ОЕВЮРХ ЛЮЯЯХБЮ
{
	for(int i=0;i<n;i++)
		std::cout<<mas[i]<<" ";
	std::cout<<"\n";
}


void * thread_func(void* data)	//ТСМЙЖХЪ ОНДЯВЕРЮ ЯСЛЛШ ЩКЕЛЕМРНБ ЯРНКАЖЮ
{
	int col=* (int *) data;
	//WaitForSingleObject(hEventEnter,INFINITE);
	//ResetEvent(hEventEnter);
	for (int j=0; j<n-1; j++)//тут небольшая ошибка была в границах цикла
	{
        pthread_mutex_lock( &cs_mutex[col] );
        //int kkk;for (int i=0;i<500000;i++) kkk=kkk+1;
        if (col!=0)//первый поток не должен ждать
        {
	while (cond[col]!=1)//пока условная переменная !=1
		pthread_cond_wait( &cs[col], &cs_mutex[col] );//будем ждать
        }
        if (arr[j] > arr[j+1])
		{
			int temp=arr[j];
			arr[j]=arr[j+1];
			arr[j+1]=temp;
		}
		if ((j>=n/2)&&(cond[col+1]!=1)&&(col<(n-1)))
		//(j>=n/2 - условие когда надо послать сигнал следующему потоку
		//cond[col+1]!=1 - сигнал ещё не послан
		//col<(n-1) - последний поток сигнал посылать не обязан, т.к. некому
		{
		    //int kkk;for (int i=0;i<500000;i++) kkk=kkk+1;
		    cond[col+1]=1;//изменяем условную переменную
		    pthread_cond_signal(&cs[col+1]);//и посылаем сигнал об этом
		    //SetEvent(hEventEnter);
		}
		pthread_mutex_unlock( &cs_mutex[col] );
	}
	return 0;
}

//================================================================================
//			главная программа
//================================================================================
int main (int argc, char *argv[])
{
//================================================================================
//		описание и инициализация данных
//================================================================================
	//hEventEnter = CreateEvent(NULL,true,true,NULL);	//ЯНАШРХЕ ОПНХГНЬКН
	for(int i=0;i<n;i++)
		arr[i]=(int)(rand()%20);
	print_arr(arr);
	for(int i=0;i<n-1;i++)
		col_num[i]=i;
	pthread_t Thread[n-1];

//================================================================================
//		работа с потоками и событиями
//================================================================================

	for (int j=0;j<n-1;j++)
	{
		int result = pthread_create(&Thread[j], NULL, thread_func, &col_num[j]);
   		if (result != 0)
   		{
     		perror("Creating the first thread");
     		return EXIT_FAILURE;
   		}
	}

	for (int j=0;j<n-1;j++)
		pthread_join(Thread[j],NULL);

	//CloseHandle(hEventEnter);
	pthread_cond_destroy(&*cs);
	pthread_mutex_destroy(&*cs_mutex);

	print_arr(arr);
	getchar();
	return 0;
}
Кстати, попробовал тормозить потоки и получается что хотя следующие потоки и будут запущены только после отработки половины предыдущего, но они иногда могут и обгонять своих коллег.
eoln вне форума Ответить с цитированием
Старый 29.05.2010, 16:25   #3
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
использование функции mail() в Linux chnry PHP 0 14.04.2010 11:05
c++ в Linux (Межпроцессорный обмен в Linux) RusLotus Помощь студентам 0 13.10.2009 16:59
Использование Linux Debian на ноутбуке Blade Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 8 03.07.2009 01:41
Linux на VMware....... WinXP <-> Linux DMUTPUU Операционные системы общие вопросы 1 24.09.2008 12:03
использование Linux в масштабах предприятия Noor Свободное общение 5 27.03.2008 00:54