Мегаобучалка Главная | О нас | Обратная связь


Если открыть программу три раза то все три раза в консолях будет появляться текст, представленный на рисунке 3.1, потому что наш семафор будет разрешать им выполнять данный вывод



2016-01-05 342 Обсуждений (0)
Если открыть программу три раза то все три раза в консолях будет появляться текст, представленный на рисунке 3.1, потому что наш семафор будет разрешать им выполнять данный вывод 0.00 из 5.00 0 оценок




Содержание

Введение................................................................................................. 5

1 Описание.............................................................................................. 6

2 Текст программы................................................................................ 7

3 Тестирование....................................................................................... 8

Заключение............................................................................................. 9

Список используемых источников...................................................... 10

 

Введение

Синхронизация потоков важна по нескольким причинам. В разных ситуациях для этой цели удобнее использовать разные механизмы операционной системы. В большинстве случаев синхронизацию используют для того что бы разные потоки и процессы, когда они обращаются к одной и той же области памяти не наделали дел при совместной попытке изменить память.

 

Описание

 

События могут быть мануальными (manual) и единичными (single). Тип события указывается при его создании. Мануалъное событие (manual event) — это не просто общий флаг для нескольких потоков. Оно выполняет несколько более сложные функции. Лю-бой поток может установить это событие при помощи вызова SetEvent или сбросить (очистить) его при помощи вызова ResetEvent. Если событие установлено, оно останется в этом состоянии сколь угодно долгое время, вне зависимости от того, сколько потоков ожидают установки этого события. Если вы обратитесь к функции PulseEvent, все потоки, ожидающие этого события, получат сообщение о том, что событие произошло. После этого событие автоматически сбросится. Другими словами, любой поток, обратившийся к функции UaitForSingleObject и в связи с этим находящийся в состоянии ожидания, получит возможность продолжить работу. Когда все потоки, ожидающие события, продолжат работу, система автоматически сбросит событие.

Такая логика работы приемлема далеко не всегда. Возможно, что для работы вашей программы требуется, чтобы в случае возникновения события на него реагировал только один из потоков, в то время как все остальные потоки продолжали ждать. Для этой цели можно использовать единичные события. Если при помощи SetEvent вы установите единичное событие (single event), только один ожидающий поток будет оповещен об этом событии и, соответственно, сможет продолжить работу. После этого система автоматически сбросит событие. Если в момент установки события не существует ни одного ожидающего потока, событие останется в сигнальном положении до тех пор, пока в системе не появится какой-либо ожидающий это событие поток. В отличие от SetEvent при использовании PulseEvent, если в системе нет ожидающих событие потоков, событие будет сброшено немедленно.

Если поток является владельцем мьютекса, он обладает правом эксклюзивного использования ресурса, который защищается этим мьютексом. Ни один другой поток не может завладеть мьютексом, который уже принадлежит одному из потоков. Вместе с тем поток, являющийся владельцем мьютекса, может попытаться стать владельцем мьютекса повторно. Если поток присваивал себе мьютекс несколько раз, он обязан освободить его такое же количество раз. Для синхронизации потоков и процессов часто используют семафоры. Если вы понимаете, как работают события и мьютексы, изучить работу семафоров не составит для вас особого труда. При создании семафора необходимо указать начальное значение счетчика. Семафоры работают очень просто. Каждый раз, когда программа обращается к семафору, значение счетчика семафора уменьшается на единицу. Когда значение счетчика становится равным нулю, семафор становится недоступным.

Если поток обращается к семафору дважды, значение счетчика семафора уменьшается на две единицы. В этом семафоры отличаются от мьютексов, так как если поток несколько раз обращается к мьютексу, это расценивается как одно обращение.

 

Текст программы

 

Текст разработанного нами приложения представлен в листинге 2.1.

 

Листинг 2.1 – Текст файла Lab1.asm

#include <windows.h>

#include <iostream>

#include <conio.h>

using namespace std;

 

void main(int arc, char* arcs[])

{

setlocale(LC_ALL, "rus_rus.1251");

 

// создаем или открываем имеющееся

HANDLE ev = CreateEvent(NULL, FALSE, FALSE, "nt5bbevent");

HANDLE sem = CreateSemaphore(NULL, 3, 3, "nt5bbsem");

if (arc == 1)

{

cout << "Проверить состояние семафора\n";

cout.flush();

if(WaitForSingleObject(sem, 10000)==WAIT_OBJECT_0 ||

WaitForSingleObject(ev, INFINITE)!=WAIT_OBJECT_0) //если получили сигнал от семафора то идем дальше, иначе если по времени то выход

{

WaitForSingleObject(sem, INFINITE);

cout << "Получен доступ к семафору\n";

cout.flush();

cout << "Получен доступ к семафору, вывожу сообщение";

WaitForSingleObject(ev, INFINITE);

ReleaseSemaphore(sem, 1, NULL);

CloseHandle(sem);

}

}

else //if(strcmp(arcs[1],"R")==0)

{

SetEvent(ev);

cout << "Есть сигнал!";

}

}

Тестирование программы

Если открыть программу три раза то все три раза в консолях будет появляться текст, представленный на рисунке 3.1, потому что наш семафор будет разрешать им выполнять данный вывод.

Рисунок 3.1 – Окно консоли при первых трех запусках

 

Если запустить больше трех окон и не закрыть первые три то наш семафор не разгрузиться, то есть будет переполненным и не разрешит вывод 2 и 3 строчки пока не появится место в семафоре (Рисунок 3.2), а оно появится если закрыть одно из первых трех окон.

Рисунок 3.2 – Окно консоли при переполненном семафоре



2016-01-05 342 Обсуждений (0)
Если открыть программу три раза то все три раза в консолях будет появляться текст, представленный на рисунке 3.1, потому что наш семафор будет разрешать им выполнять данный вывод 0.00 из 5.00 0 оценок









Обсуждение в статье: Если открыть программу три раза то все три раза в консолях будет появляться текст, представленный на рисунке 3.1, потому что наш семафор будет разрешать им выполнять данный вывод

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (342)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)