С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
66 / 66 / 31
Регистрация: 11.03.2016
Сообщений: 252
1

Написать семафор на основе событий

14.04.2016, 06:43. Показов 2339. Ответов 5

Author24 — интернет-сервис помощи студентам
Подобная тема всплывала на форуме не раз, но, тем не менее, ответа на вопрос никто не дал.

Итак, как написать семафор в Windows, используя только события? Вот моя наивная попытка, но она не работает.
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
class Semaphore
{
public:
    Semaphore(long initialCount, long maxCount):
        _count(initialCount), _maxCount(maxCount),
        _event(CreateEvent(NULL, FALSE, FALSE, NULL))
    {
    }
 
    ~Semaphore() {
        CloseHandle(_event);
    }
 
    void acquire() {
        if (!_count) {
            WaitForSingleObject(_event, INFINITE);
        }
        InterlockedDecrement(&_count);
    }
 
    void release() {
        InterlockedIncrement(&_count);
        SetEvent(_event);
    }
 
protected:
    long    _count;
    long    _maxCount;
    void*   _event;
};
Насколько я понимаю, в acquire мы имеем data race, и нам нужно сделать декремент вместе со сравнением.

Предложения приветствуются. Ответы "в WinAPI и так есть семафоры" не рассматриваются - я не настолько тупой.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.04.2016, 06:43
Ответы с готовыми решениями:

Реализовать семафор на основе объекта синхронизации «событие»
Здравствуйте, помогите пожалуйста. Реализовать семафор на основе объекта синхронизации «событие»....

Создание проекта с методами на основе событий
Помогите написать программу, которая считает данные при помощи полей ввода, вычисляет значения...

Разработать форму и написать обработчики событий
Составить программу, вычисляющую для двух заданных комплексных чисел z1 и z2 либо величину z1/z2,...

Написать код с использованием событий и делегатов
Подскажите, как правильно реализовать следующую задачу: Есть класс Man: public class Man ...

5
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.04.2016, 09:03 2
Цитата Сообщение от DeadPenguin Посмотреть сообщение
Подобная тема всплывала на форуме не раз
Например, где?

Цитата Сообщение от DeadPenguin Посмотреть сообщение
Итак, как написать семафор в Windows, используя только события? Вот моя наивная попытка, но она не работает.
Хм... Здесь сказано только про события, но, тем не менее, в коде
используются также interlocked-функции. Так какое условие задачи, если быть точным?
И что значит "не работает"? И почему здесь нигде не используется _maxCount?
0
66 / 66 / 31
Регистрация: 11.03.2016
Сообщений: 252
14.04.2016, 13:32  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Например, где?
Поиск по форуму и гуглу выдаёт

Цитата Сообщение от Убежденный Посмотреть сообщение
Здесь сказано только про события, но, тем не менее, в коде
используются также interlocked-функции
Имеется в виду что нельзя использовать никакие другие примитивы типа мьютексов. Как я понимаю, без атомарных операций это всё равно невозможно в принципе.

Цитата Сообщение от Убежденный Посмотреть сообщение
Так какое условие задачи, если быть точным?
Реализовать семафор на основе объекта синхронизации события. Количественные характеристики семафора должны быть аналогичны соответствующему объекту ядра типа семафора.
Цитата Сообщение от Убежденный Посмотреть сообщение
И что значит "не работает"?
Ну то и значит - в окруженный семафором блок входит больше потоков. Даже если использовать семафор как мьютекс.

Цитата Сообщение от Убежденный Посмотреть сообщение
И почему здесь нигде не используется _maxCount?
Хороший вопрос Но это пока не главное. Просто семафор всегда конструируется как
Код
Semaphore s(permits, permits);
, и если его использовать правильно, то всё должно работать.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
14.04.2016, 13:39 4
Ну если атомарные операции использовать не возбраняется, тогда
можно навелосипедить свой простейший спинлок или критическую секцию
на базе все тех же евентов и закрыть им участки кода семафора, которые
требуют синхронизации. Семафор, конечно, получится из этого так себе,
но условию задачи будет удовлетворять.
0
66 / 66 / 31
Регистрация: 11.03.2016
Сообщений: 252
14.04.2016, 20:28  [ТС] 5
Убежденный, а хотя бы примерно как? Я написал мьютекс на событиях, и он вроде даже работает. Но мне не хочется делать всё настолько по-идиотски - отдельный мьютекс, отдельный семафор, который его использует. Как я понимаю, критическая секция не будет отличаться по релаизации.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.04.2016, 10:03 6
Цитата Сообщение от DeadPenguin Посмотреть сообщение
а хотя бы примерно как?
Ты поясни, что конкретно вызывает затруднения. Логику работы семафора представляешь?
Напиши для начала код семафора, но без синхронизации потоков. То есть, просто объект со
счетчиками и евентом/мьютексом, который разрешает или запрещает доступ, больше ничего.
Далее нужно определить участки кода, которые требуют синхронизации, и каждый из
них попытаться переписать либо на interlock-ах, либо на других легковесных примитивах
синхронизации - CAS, spinlocks, критические секции, rw-locks и т.д.
0
15.04.2016, 10:03
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2016, 10:03
Помогаю со студенческими работами здесь

Написать программу для перехвата и сортировки системных событий
Завтра курсовая , а кода как не было , так и нет. Последняя надежда на Вас , господа. Нужно...

Написать программу на основе примера
На основе приведенного примера написать программу, которая при введеном в строку s1 имени файла...

Написать процедуру на основе представления
у меня есть представление из 4 таблиц и мне нужно чтобы в конце у меня вывело только именна файлов...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru