Доброго времени суток, столкнулся с такой проблемой, нужно реализовать событийную очередь, то есть когда в очередь добавляется элемент, то генерируется событие, а параллельный поток висит в ожидании этого события. В 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);
}