Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Сервис онлайн-записи на собственном Telegram-боте
    Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое расписание, но и напоминать клиентам о визитах тоже. Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.
    Для новых пользователей первый месяц бесплатно.
    Чат-бот для мастеров и специалистов, который упрощает ведение записей:
    Сам записывает клиентов и напоминает им о визите;
    Персонализирует скидки, чаевые, кэшбэк и предоплаты;
    Увеличивает доходимость и помогает больше зарабатывать;
    Начать пользоваться сервисом
  • Семафоры






    Семафо́ р (англ. semaphore) — объект, ограничивающий количество потоков, которые могут войти в заданный участок кода.

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

    Функция CreateSemaphore создает объект-семафор с указанием и максимально возможного начального его значения, OpenSemaphore – возвращает дескриптор существующего семафора, захват семафора производится с помощью ожидающих функций, при этом значение семафора уменьшается на единицу, ReleaseSemaphore - освобождение семафора с увеличением значения семафора на указанное в параметре число.

    Пример. Синхронизация нитей с помощью семафоров.

    #include < windows.h> #include < stdio.h> HANDLE hSem; int a[5]; HANDLE hThr; unsigned long uThrID; void Thread(void* pParams){ int i, num = 0; while (1) { WaitForSingleObject(hSem, INFINITE); for (i=0; i< 5; i++) a[i] = num; num++; ReleaseSemaphore(hSem, 1, NULL); }}int main(void){ hSem=CreateSemaphore(NULL, 1, 1, " MySemaphore1"); hThr=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread, NULL, 0, & uThrID); while(1) { WaitForSingleObject(hSem, INFINITE); printf(" %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]); ReleaseSemaphore(hSem, 1, NULL); }return 0; } HANDLE WINAPI CreateSemaphore(_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, _In_ LONG lInitialCount, _In_ LONG lMaximumCount, _In_opt_ LPCTSTR lpName); BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount); { Первый параметр функции - дескриптор семафора. Второй параметр указывает величину, на которую должно быть увеличено значение счетчика. Параметр lpPreviousCount является указателем на переменную, в которой функция сохраняет предыдущее значение счетчика. Если сохранять это значение не нужно, то в качестве последнего параметра передается NULL.}

    Классические семафоры-счетчики, используют следующие примитивы.

    sema p () Уменьшает значение семафора (с возможным блокированием потока)

    sema v () Увеличивает значение семафора (с возможным деблокированием ожидающего потока) sema tryp () Уменьшает значение семафора (если не требуется блокирование).

    sema__tryp () обеспечивает программисту возможность использовать на уровне пользовательских потоков






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.