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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 18.06.2010, 12:54   #1
session
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 14
По умолчанию работа с потоками

в процессе создано два дополнительных потока, первый поток заполняет массив из пяти чисел одинаковыми значениями, второй поток выводит этот массив на экран:
Код:
int a[5];
int num;

void Thread1( void* pParams )
{
int i;
while ( true )
{
for (i = 0; i < 5; i++ ) 
{
a[i] = num;

}
num++;
}
}

void Thread2( void* pParams )
{
num = 0;
while( TRUE )
{
printf( "%d %d %d %d %d\n",a[ 0 ], a[ 1 ], 
a[ 2 ], a[ 3 ], a[ 4 ] );
}
}
Требуется обеспечить следующее условие: во время заполнения массива потоком «Thread 1», этот поток не должен прерываться другими потоками. В таком случае выведенные вторым потоком числа будут одинаковыми.
Запустив программу, мы обнаружим, что в некоторых строках массив имеет различные значения. Это говорит о том, что работа потока «Thread 1» прерывается потоком «Thread 2» на середине заполнения массива.
Для решения данной проблемы воспользуемся механизмом критических секций. Для этого необходимо подключить библиотеку windows.h и объявить использование критических секций:
Код:
#include <windows.h>
...
CRITICAL_SECTION cs;
...
InitializeCriticalSection( &cs ); /* Инициализация критической секции */
Алгоритм использования критической секции следующий: пока один поток не вышел из критической секции, другой поток не может в неё зайти. Вход и выход в критическую секцию осуществляется следующими функциями:
Код:
EnterCriticalSection(&cs); // Вход в критическую секцию cs
LeaveCriticalSection(&cs); // Выход из критической секции cs
Задание: самостоятельно с использованием механизма критических секций добейтесь корректного выполнения программы (в каждой строке должны быть одинаковые числа):
P.S из отдельных частей программы нужно составить одну. что-то у меня никак не получается с критическими секциями. есть вариант, но он не работает
Код:
#include<stdio.h>
#include<conio.h>
#include<process.h>
#include<windows.h>
CRITICAL_SECTION cs;


int a[5];
int num;

void Thread( void* pParams )
{
int i, num=0;
while ( true )
{ EnterCriticalSection(&cs);
for (i = 0; i < 5; i++ ) 
a[i] = num;
LeaveCriticalSection(&cs); 
num++;
}
}
int main ()
{InitializeCriticalSection( &cs ); 
_beginthread( Thread, 0, NULL );

while( true )
{EnterCriticalSection(&cs); 
printf( "%d %d %d %d %d\n",a[ 0 ], a[ 1 ], 
a[ 2 ], a[ 3 ], a[ 4 ] );
LeaveCriticalSection(&cs); 
}
return 0;}

Последний раз редактировалось Stilet; 18.06.2010 в 13:14.
session вне форума
Старый 18.06.2010, 17:58   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Что именно не работает?
Carbon вне форума
Старый 19.06.2010, 00:13   #3
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
#include<stdio.h>
#include<conio.h>
#include<process.h>
#include<windows.h>
CRITICAL_SECTION cs;


int a[5]={0,0,0,0,0};
int num(0);

void Thread( void* pParams )
{
	int i, num=0;
	while ( true ){ 
		EnterCriticalSection(&cs);
		for (i = 0; i < 5; i++ )
		{
			a[i] = num;
		}
		LeaveCriticalSection(&cs); 
		num++;
		Sleep(3000);
	}
	return;
}
int main (){
	InitializeCriticalSection( &cs ); 
	_beginthread( Thread, 0, NULL );
	Sleep(2000);
	while( true ){
		EnterCriticalSection(&cs); 
		printf("%d %d %d %d %d\n",a[0], a[1], a[2], a[3], a[4]);
		LeaveCriticalSection(&cs); 
		Sleep(3000);
	}
	return 0;
}
Для начала усыпляем на небольшое время главный поток (MainThread), чтобы смог начать сначала второстепенный поток, который инициализирует массив.Обычно я использовал синхронизационные объекты, например Мьютекс, владельцем которого может быть только один поток - как раз вы его занимаете одним потоком, а второй ждет его освобождения. Он идеален в проблеме критических секций.
Ну через технологию критических секций я поправил. Главное - это усыпить главный поток, дать начать работать второму потоку, забрать секцию ему, после работы ее освободить и усыпить поток так же на такое же время, дать главному потоку время вывести, и опять усыпить главный - и так до бесконечности - будет последовательная работа потоков.
Время сна главного потока в начале совместной работы с другим потоком и впоследствии их работы разное! Это важно, потому что если оно будет одинаковое (или первое будет больше чем второе), то произойдет рассинхронизация, начнет проскальзывать непоочередное выполнение, num будет инкрементироваться по два раза и в общем полный хаос)

Последний раз редактировалось capta1n; 19.06.2010 в 00:19.
capta1n вне форума
Старый 19.06.2010, 09:31   #4
session
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 14
По умолчанию

capta1n, спасибо вам большое за то, что уделили время.
однако, при компиляции у меня почему-то возникают ошибки
ошибки вашего кода:
CRITICAL_SECTION command not found
int command not found
line 9-syntax error near unexpected token 'num(0'
line 9-int num(0);
при компиляции моего кода ошибки аналогичные!! не пойму в чем причина.
пишу не в вижуал С++, потому что нет библиотеки windows.h. препод посоветовал писать в minGW msys. это прототип юникса и именно он выдает такие ошибочкиА у вас код работает в вижуале? может просто у меня дома что-то не так? попробовать в инстике?
session вне форума
Старый 19.06.2010, 09:39   #5
session
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 14
По умолчанию

Carbon, у меня не получается реализовать механизм критических секций. я вообще не знаю работает ли мой код, потому что при компиляции в minGW msys выдает ошибки. я не могу создать даже исполняемый файл.
ошибки при компиляции моего кода:
CRITICAL_SECTION command not found
line 6-syntax error near unexpected token &c
и какая-то ошибка в инициализации критической секции
session вне форума
Старый 19.06.2010, 22:37   #6
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

я бы нерабочий код не выложил)
компилировал в Visual Studio 2010, Да и в 2008 должна пойти
вообще взял-то я ваш код, я не знаю, почему он не компилируется
capta1n вне форума
Старый 21.06.2010, 17:13   #7
session
Пользователь
 
Регистрация: 18.06.2010
Сообщений: 14
По умолчанию

дома все равно не работает.попробую в универе еще)спасибо вам
session вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками Яр|/||< (^_^) Общие вопросы Delphi 5 09.03.2010 08:23
Работа с потоками den49 Помощь студентам 0 06.10.2009 14:52
Работа с потоками Neymexa Общие вопросы .NET 16 23.04.2009 17:42
работа с потоками Alex_Pro Общие вопросы .NET 1 01.07.2008 07:25
C++, работа с потоками mat90x Помощь студентам 20 15.05.2008 22:20