Библиотека семафоров до C++20

Вопрос или проблема

C++20 принесет счетчики и бинарные семафоры в язык. Тем временем, существует ли библиотека для C++11/14/17, предоставляющая аналогичную функциональность?

Требуемые функции:

  • Поддерживается на Linux
  • Поддерживает как минимум бинарные семафоры
  • Бесплатно
  • Лицензия Libre

Желательные функции:

  • Поддерживает счетчики семафоров
  • Поддерживается на любой платформе, которая предлагает потоки/семафоры POSIX
  • Небольшой размер (т.е. не требует Boost или Abseil и т.д.)
  • Не крошечная база пользователей
  • Активно поддерживается
  • Хорошо использует возможности C++11/14/17 и, в частности, хорошо взаимодействует с std::thread, если необходимо.
  • Документировано

Немного элементы требований неясны, но все равно интересно:

Библиотека BinarySemaphore Эрика Ригторпа, основанная на футексах. Это комбинация механизмов синхронизации в пространстве ядра и пользовательском пространстве, которая может быть довольно быстрой, поскольку большая часть взаимодействия с ней осуществляется с помощью атомарного значения в пользовательском пространстве и не требует системных вызовов.

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

Бенуа Дакаче написал небольшую библиотеку оберток C++ для сокетов BSD, потоков POSIX и семафоров POSIX: CPPWrappers.

Его обертка семафора чрезвычайно проста; настолько проста, что я могу просто процитировать весь код (без комментариев, лицензии и т.д. – взгляните на исходный код для получения информации о лицензии):

#include <semaphore.h>
#include <fcntl.h>

class Semaphore {
public:
    Semaphore(char name[], unsigned int val);
    int wait() { return sem_wait(sem); }
    int post() { return sem_post(sem); }
    int tryWait() { return sem_trywait(sem); }
    void close() { sem_close(sem); sem_unlink(name); }

private:
    sem_t* sem;
    char* name;
};

Semaphore::Semaphore(char name[], unsigned int val)
{
    sem_unlink(name);
    this->name = name;
    this->sem = sem_open(name, O_CREAT | O_EXCL, 0666, val);
}

Ответ или решение

Библиотека семафоров до C++20: Подбор и рекомендации

С введением C++20 в язык программирования C++ ожидается наличие встроенных средств работы с семафорами, включая бинарные и счётные семафоры. Однако разработчики, работающие с версиями C++11, C++14 или C++17, могут столкнуться с задачей поиска подходящей библиотеки для работы с семафорами в промежуточный период. В данной статье мы рассмотрим несколько библиотек, удовлетворяющих критериям этого запроса.

Основные требования к библиотеке

При выборе библиотеки для работы с семафорами необходимо учесть следующие характеристики:

  1. Поддержка Linux: Библиотека должна работать на операционной системе Linux.
  2. Существование бинарных семафоров: Обязательное наличие бинарных семафоров.
  3. Бесплатность и свободная лицензия: Библиотека должна быть доступна бесплатно и иметь открытое лицензирование.

Рекомендуемые библиотеки

1. BinarySemaphore от Erik Rigtorp

BinarySemaphore – это простая библиотека для работы с бинарными семафорами, основанная на концепции futex. Futex – это механизм синхронизации, который сочетает в себе использование пространств ядра и пользовательского пространства, что позволяет значительно ускорить операции, так как большинство взаимодействий происходит в пользовательском пространстве и не требует системных вызовов.

Однако стоит отметить, что futex не является POSIX механизмом и доступен только на Linux. К тому же, в библиотеке отсутствует реализация счётных семафоров, что может быть ограничением для более сложных приложений.

2. CPPWrappers от Benoit Dacacche

Если вы ищете простую и лёгкую в использовании библиотеку, обратите внимание на CPPWrappers, которая содержит обёртки для BSD сокетов, POSIX потоков и POSIX семафоров. Обёртка для семафоров в этой библиотеке очень проста и лаконична:

#include <semaphore.h>
#include <fcntl.h>

class Semaphore {
public:
    Semaphore(char name[], unsigned int val);
    int wait() { return sem_wait(sem); }
    int post() { return sem_post(sem); }
    int tryWait() { return sem_trywait(sem); }
    void close() { sem_close(sem); sem_unlink(name); }

private:
    sem_t* sem;
    char* name;
};

Semaphore::Semaphore(char name[], unsigned int val)
{
    sem_unlink(name);
    this->name = name;
    this->sem = sem_open(name, O_CREAT | O_EXCL, 0666, val);
}

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

Пожелания по возможностям библиотек

Хотя вышеперечисленные библиотеки удовлетворяют базовым требованиям, стоит учитывать дополнительные желаемые функции:

  • Поддержка счётных семафоров: Возможность работы как с бинарными, так и с счётными семафорами является важным аспектом для многих приложений.
  • Кроссплатформенная поддержка: Поддержка различных платформ, которые предлагают POSIX потоки и семафоры.
  • Небольшой размер: Нет потребности в тяжёлых библиотеках, таких как Boost или Abseil, что позволяет минимизировать вес проекта.
  • Активное сопровождение: Библиотеки с активным сообществом обеспечивают лучшее сопровождение и поддержку.
  • Документация: Хорошо задокументированные библиотеки облегчают их использование и интеграцию.

Заключение

Выбор библиотеки для работы с семафорами в C++11/14/17 зависит от ваших конкретных требований и предпочтений. BinarySemaphore предлагает эффективное решение для бинарных семафоров, но ограничен в функциональности. В то время как CPPWrappers отличается простотой и доступностью, однако требует ручной реализации более сложных алгоритмов для работы со счётными семафорами. Убедитесь, что выбранная вами библиотека соответствует как требованиям, так и функционалу вашего проекта.

Оцените материал
Добавить комментарий

Капча загружается...