Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
6 / 6 / 1
Регистрация: 12.10.2016
Сообщений: 141
1
.NET 4.x

Объясните как работает Semaphore

02.07.2019, 15:23. Показов 4385. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При задании минимального кол-во запросов(5), как я понимаю семафор выполнит действие, если запросов будет не меньше 5, но к примеру задал 3 запроса и они выполняются, хотя так не должно быть как пишется в подсказке "Начальное кол-во запросов для семафора, которое может быть обеспечено одновременно". Или же семафор выполнит запросы от 1 до 5 указанных?
C#
1
Semaphore sem = new Semaphore(5, 10);
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2019, 15:23
Ответы с готовыми решениями:

Как реализовать многопоток? (возможно Semaphore)
Здравствуйте, есть задача выполнять некий кусок кода разными небольшими программами в несколько...

Объясните, как работает код
Добрый вечер. Код написан верно,помогите понять как она считает,отладку делала не понимаю откуда он...

Объясните как работает XMLreader
есть строка с xml? нужно прочитать из неё все данные, прочитать желательно быстро, как вариант...

Ряд Фибоначчи. Объясните как можно популярнее как работает рекурсия
По возможности максимально подробно расскажите про рекурсию public int Fibonacci(int n) { ...

8
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
02.07.2019, 17:10 2
У семафора задано 5 доступных по умолчанию и 10 доступных максимум.

Release() число доступных увеличивает.. Если есть, куда.
Wait() число доступных уменьшает. Если есть, куда, не ниже нуля т.е..

Если уменьшать (Wait) уже некуда, то программа будет ждать, пока не появятся новые доступные (Release).
1
6 / 6 / 1
Регистрация: 12.10.2016
Сообщений: 141
02.07.2019, 21:31  [ТС] 3
может я не понял ответ, но объясните как это работает
Цитата Сообщение от Yerta Посмотреть сообщение
если запросов будет не меньше 5, но к примеру задал 3 запроса и они выполняются
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
02.07.2019, 21:34 4
Лучший ответ Сообщение было отмечено Yerta как решение

Решение

Начальное количество 5.
Вы забираете 3. Остаётся 2.
Поэтому 3 выполняются.
Сам семафор ничего не пишет и не выполняет. Вы у него запрашиваете количество доступных ресурсов. Но это ресурс не семафора, а чего-то другого.
1
6 / 6 / 1
Регистрация: 12.10.2016
Сообщений: 141
02.07.2019, 21:44  [ТС] 5
Теперь понятно, спасибо

Добавлено через 6 минут
А какую тогда роль сыграет максимальное число запросов 10, если будут заняты все 5 запросов? получается кол-во свободных запросов равны 0.
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
02.07.2019, 21:47 6
5 это начальное количество доступных, что можно снять вызовом Wait. Но вызовом Release вы можете увеличить его до максимума - 10. Попробуете больше этого - вылетит исключение.

Добавлено через 1 минуту
Обычное делается Wait, если нужно занять ресурс. И потом Release, когда ресурс уже не нужен.
1
6 / 6 / 1
Регистрация: 12.10.2016
Сообщений: 141
02.07.2019, 22:45  [ТС] 7
Исключение получил, когда закомментировал WaitOne.
Кажется я понял как все работает, 5 может принять кол-во вызовов от 1 до 5 за раз, если вызовов больше к примеру 7, то в силу уже вступает 10, т.е. получается 5 тогда уже не играет никакой роли, так как используется 7 из 10 допустимых запросов? Правильно понимаю?
0
Эксперт .NET
10574 / 6498 / 1506
Регистрация: 25.05.2015
Сообщений: 19,686
Записей в блоге: 14
02.07.2019, 23:08 8
Нет, всё неправильно.

Добавлено через 7 минут
Вот 5 из 10.
5 ресурсов есть и вы их можете взять (Wait).
Чтобы взять (Wait) больше, надо подождать, пока кто-то не поместит (Release) ещё.
Если ресурс уже вам не нужен, надо вернуть/поместить его обратно (Release).
Если хотите вернуть (Release) слишком много, оно больше указанного ранее количества (10) не влезет и будет ругаться (SemaphoreFullException).
Миниатюры
Объясните как работает Semaphore  
0
6 / 6 / 1
Регистрация: 12.10.2016
Сообщений: 141
03.07.2019, 15:12  [ТС] 9
На сколько я понял Release может увеличить кол-во минимальных запросов с 5 к примеру до 8 или же до 10, если больше, то будет исключение.

Вот пример как работает семафор:
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Threading;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 30; i++)
            {
                Reader reader = new Reader(i);
            }
            Console.ReadLine();
        }
    }
 
    class Reader
    {
        static Semaphore sem = new Semaphore(4, 8);
        static int count = 1;
        Thread thread;
 
        public Reader(int i)
        {
            thread = new Thread(Read);
            thread.Name = "Name " + (i + 1).ToString();
            thread.Start();
        }
        public void Read()
        {
            sem.WaitOne(); // работает как декремент 
            Console.WriteLine("{0} входит/действие/выход", Thread.CurrentThread.Name);
            if (count == 4)
            {
                Console.WriteLine();
                sem.Release(); // работает как инкремент 
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
            }
            else if (count == 12)
            {
                Console.WriteLine();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
                sem.Release();
            }
            else if (count == 20)
            {
                sem.Release();
                Console.WriteLine();
            }
            else if (count > 20)
            {
                sem.Release();
            }          
            count++;
        }
    }
}
До срабатывания if(count == 4) видно что семафор принимает от 1 до 4 запроса одновременно, когда счётчик увеличился до 4 происходит высвобождение ресурсов, 1-е 4 sem.Release(); освобождают семафор, 2-е 4 еще увеличивают кол-во запросов до максимального значения 8, если будет больше 8, то получаем исключение.
else if (count == 12) делает тоже самое что и if(count == 4), сделал для примера.
else if (count == 20) освобождает семафор, без увеличения запросов. (данное условие сделал для наглядного отделения от else if (count == 12), чтобы не сливались строки).
else if (count > 20) делает тоже самое что и предыдущий if.

Для примера, есть библиотека на 4(мин.)-8(еще 4, так сказать запасных) мест и 30 читателей, при открытии библиотеки в 10:00 дня одновременно в нее заходят от 1 до 4 читателя, остальные в очереди на улице. В 12:00 разрешается посещать в максимальном количестве (8), после 14:00 библиотека работает как и в 10:00.
Миниатюры
Объясните как работает Semaphore  
0
03.07.2019, 15:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2019, 15:12
Помогаю со студенческими работами здесь

Объясните как работает этот цикл
using System; class lol { public static void Main() { int su = 0; int...

Объясните как работает алгоритм Цезаря
Можете мне объяснить как работает Алгоритм цезаря. И можете сделать пример этого алгоритма с...

Объясните подробно, как работает код на C#
int save = -1; string Result = new string; // массив строк для списка частотности ...

Объясните, пожалуйста, как работает цикл?
private void button4_Click(object sender, RoutedEventArgs e) { int j = 2; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru