Задать вопрос
@mvaleris

Синхронизация потоков в Mac OSX средствами kqueue?

Доброго времени суток, столкнулся с такой проблемой, нужно реализовать событийную очередь, то есть когда в очередь добавляется элемент, то генерируется событие, а параллельный поток висит в ожидании этого события. В windows это делается довольно таки просто: CreateEvent, SetEvent, WaitForSingleObject, ResetEvent, в линукс тоже это тоже решается средствами eventfd (код сложнее чем на windows), а вот в Mac OS нет ни первого, ни второго, но есть альтернатива kqueue, но никак не получается разобраться как реализовать высылку пользовательского события, ожидание его по тайм-ауту, сброс этого события.
Буду очень благодарен за помощь!

В качестве примера приведу такой код, найденный на просторах интернета:
#  include <sys/types.h>
#  include <sys/event.h>
#  include <sys/time.h>
#  include <unistd.h>

struct kevent change; 
struct timespec ts;
int kq;

void createEvent()
{
    kq = kqueue();
    EV_SET(&change, SIGHUP, EVFILT_SIGNAL, EV_ADD | EV_ENABLE, 0, 0, 0);
}

void sendEvent()
{
    signal(SIGHUP, SIG_IGN);
}

bool waitEvent(uint32_t timeoutMs)
{
    ts.tv_sec  = 0;
    ts.tv_nsec = timeoutMs*1000000;

    if (kevent(kq, nullptr, 0, &change, 1, &ts) > 0) {
        resetEvent();
        return true;
    }

    return false;
}

void resetEvent()
{
    EV_SET(&change, SIGHUP, EVFILT_SIGNAL, EV_CLEAR | EV_ENABLE, 0, 0, 0);
}
  • Вопрос задан
  • 219 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@mvaleris Автор вопроса
Решил пойти альтернативным путём, так как mutex умеет ждать, чтобы заблокироваться, то этим его свойством решил воспользоваться и получилось то, что нужно! Провёл сравнение работы очереди на разных ОС:
- Windows (MSVC 2015 x32) - 1,463 msecs (события организованы через CreateEvent)
- Windows (MinGW 5.3.0 x32) - 1,516 msecs (события организованы через CreateEvent)
- Kubuntu 16.04 x64 - 1,093 msecs (события организованы через eventfd)
- Mac OS Yosemite 10.10.5 - 1,285 msecs (события организованы через mutex)

Надеюсь эта информация будет кому нибудь полезна. К слову, проводя сравнение скорости работы кода в windows/linux/mac заметил закономерность, windows всегда выполняет код медленнее, во всех тестах она уступает linux. У меня даже отношение к Linux изменилось в лучшую сторону. Ещё интересный момент когда нужно выполнять много математических вычислений, то компилятор MinGW с включёнными оптимизациями превосходит тоже самое но собранное компилятором MSVC также с оптимизациями, для меня это было открытие.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы