Форум программистов, компьютерный форум CyberForum.ru

Потоки.События.Не могу разобраться - C++

Восстановить пароль Регистрация
 
VASYA_A
2 / 2 / 0
Регистрация: 11.09.2013
Сообщений: 129
10.03.2014, 23:18     Потоки.События.Не могу разобраться #1
Здравствуйте . Пытался разобраться с синхронизацией нитей , а точнее- с событиями . Нашёл пример :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
HANDLE hEvent1, hEvent2;
int a[5];
HANDLE hThr;
unsigned long uThrID;
void Thread( void* pParams )
{ 
    int i, num = 0;
    while (1)
    { 
        WaitForSingleObject( hEvent2, INFINITE );
        for (i=0; i<5; i++) a[i] = num;
        num++;
        SetEvent( hEvent1 );
    }
}
 
int main( void )
{ 
    hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL );
    hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL );
    hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);
    while(1)
    {
        WaitForSingleObject( hEvent1, INFINITE );
        printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
        SetEvent( hEvent2 );
    }
    return 0;
}
Не могу понять , как он работает
Когда запускаю- происходит бесконечный вывод 5-ти цифр
Разве так и должно быть?

Росталкуйте , пожалуйста , что происходит вот в этом фрагменте :
C++
1
2
3
4
5
6
while(1)
    {
        WaitForSingleObject( hEvent1, INFINITE );
        printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]);
        SetEvent( hEvent2 );
    }
сколько читаю- не пойму никак(
заранее спасибо!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,296
Завершенные тесты: 1
10.03.2014, 23:49     Потоки.События.Не могу разобраться #2
Цитата Сообщение от VASYA_A Посмотреть сообщение
Не могу понять , как он работает
Здесь попеременно выполняются тела циклов while в main и в Thread, а
рулят этим процессом события hEvent1 и hEvent2 - когда одно устанавливается,
второе сбрасывается, потом наоборот, и за счет этого достигается строгая
очередность.

Цитата Сообщение от VASYA_A Посмотреть сообщение
сколько читаю- не пойму никак(
Возможно, Вам лучше сначала почитать что-нибудь по основам
синхронизации в Windows. Например, Рихтера, Харта или Побегайло.
Ну и еще здесь, конечно:

Event Objects
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
VASYA_A
2 / 2 / 0
Регистрация: 11.09.2013
Сообщений: 129
11.03.2014, 00:03  [ТС]     Потоки.События.Не могу разобраться #3
Спасибо.
То есть , в функции Thread - сначала с помощью WaitForSingleObject ждём , когда событие hevent2 станет готовым к исполнению, далее в цикле считаем числа и SetEvent - состояние событие поставили в сигнальное

а в мейне всё наоборот.. ( это пока не очень понятно )

я вообще , если честно , не могу никак понять , что же это за события - hEvent1, hEvent2 ? Пожаалуйста , можете объяснить , хотя бы немного , простыми словами ? Я чисто суть не могу уловить (
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,296
Завершенные тесты: 1
11.03.2014, 00:20     Потоки.События.Не могу разобраться #4
Цитата Сообщение от VASYA_A Посмотреть сообщение
То есть , в функции Thread - сначала с помощью WaitForSingleObject ждём , когда событие hevent2 станет готовым к исполнению, далее в цикле считаем числа и SetEvent - состояние событие поставили в сигнальное
а в мейне всё наоборот
Ну да, вроде того.

Цитата Сообщение от VASYA_A Посмотреть сообщение
я вообще , если честно , не могу никак понять , что же это за события - hEvent1, hEvent2 ? Пожаалуйста , можете объяснить , хотя бы немного , простыми словами ? Я чисто суть не могу уловить
Событие - это объект, который может находиться либо в сигнальном (установлено),
либо в несигнальном (сброшено) состоянии. Пока событие сброшено, любой поток,
который вызовет на нем wait-функцию (WaitForXXXX), сразу же будет отправлен в
"спячку". Т.е. пассивное ожидание. Как только событие перейдет в сигнальное
состояние, поток выйдет из спячки и продолжит работу. Это удобно использовать
для синхронизации потоков, а также для ожидания э-э... событий. Видите -
название Win32-событий как нельзя лучше отражают их суть.

События бывают двух видов - synchronization event и notification event.
То же самое еще называют auto-reset event и manual-reset event, то есть,
авто-сброс и ручной сброс (состояния). Manual-reset event прост - вы вручную
устанавливаете и сбрасываете событие, и его состояние не меняется, пока вы
сами не сделаете это. Эта особенность часто используется для уведомления
одного или нескольких потоков - если несколько потоков ждут одного и того
же события, то при переводе его в сигнальное состояние все они проснутся.
Хоть и нельзя предугадать, кто раньше, а кто позже.

Auto-reset event работает чуть по-другому.
Когда кто-то просыпается из ожидания на событии с авто-сбросом, то это
событие сразу автоматически сбрасывается. Т.е. только один поток пробуждается.
Так, например, можно гарантировать, что только один поток войдет в критический
участок кода. С manual-reset event все потоки сразу ринулись бы в этот
участок и синхронизация была бы нарушена.

Ай, ну в общем, что я объясняю тут, все равно никогда не напишу лучше,
чем в правильных книгах по системному программированию.
Лучше один раз прочесть, чем сто раз спросить на форуме, уж поверьте
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,296
Завершенные тесты: 1
11.03.2014, 00:23     Потоки.События.Не могу разобраться #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Удалил.

Не по теме:


И зря. Краткость - с.т.
Написали кратко, и по делу, не то, что я.
Зави-и-идую

Yandex
Объявления
11.03.2014, 00:23     Потоки.События.Не могу разобраться
Ответ Создать тему
Опции темы

Текущее время: 13:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru