Пользовательские события в Unix C ++

0

Я пытаюсь перенести мое многопоточное приложение Windows в Unix. В моем приложении мы создали пользовательские события, которые сигнализируют потоку выполнить конкретную задачу. Я обнаружил, что условную переменную или семафор можно использовать для сигнализации потоков. Моим требованием является создание динамических событий по запросу, но это невозможно для условной переменной или семафор. Помогите мне использовать такие события, как концепции сигнализации в Unix.

  • 0
    Я не понимаю, почему «это невозможно с условной переменной или семафором».
  • 0
    Я создаю некоторый набор событий и сохраняю дескриптор события в очереди. Потоки извлекают события из очереди и используют событие для сигнализации других потоков. Здесь один поток будет ожидать нескольких сигналов (в windows, WaitForMultipleObjects), но это невозможно с условными переменными. они не будут слушать несколько сигналов.
Показать ещё 2 комментария
Теги:
multithreading

1 ответ

0

Посиковые потоки позволяют общаться между потоками с мьютексом и условиями. man pthreads, man pthread_cond_wait и другие.

Другой способ создания событий не зависит от потоков и делает на дескрипторах. Смотрите man epoll, man poll, man select

Внедрение системы событий вручную на C может занять некоторое время, поэтому существуют библиотеки, которые реализуют систему libev, libuv как libev, libuv, libevent, libevent2.

Если вы хотите больше C++ то C вы можете использовать boost (например, boost::signals. Не знаете, есть ли другие) или Qt, у которого есть полный механизм сигнала/слота и система событий, встроенная. Но для этого требуется довольно тяжелая зависимостей.

Если вы хотите, чтобы полная реализованная очередь событий и многие функции Interprise, вы можете посмотреть любую инфраструктуру AMQP такую как rabbitmq.

Трудно сказать вам, что вам нужно, без особых проблем.

  • 0
    У меня есть поток, который будет ждать нескольких событий для установки. WaitForMultipleObjects (8, lup_ReleaseParam-> msp_AcquizationEvent, FALSE, 1). В Unix я не нашел эквивалентных методов ожидания для сигнала нескольких событий. Если я использую условную переменную "pthread_cond_wait (& cond, & mutex)", она не будет прослушивать несколько событий.
  • 0
    @ vanith55 Вы читали о других возможностях, которые я упомянул? Я не знаком с программированием Windows, но в соответствии с msdn и вашим параметром FALSE вы хотите обработать событие так, как оно произошло (вы не ждете все). Таким образом, вы можете использовать один из «poll», «select» или «epoll», чтобы сделать это. Вы можете создать канал (см. Man pipe) или socketpair (см. Man socketpair) и использовать дескриптор write в потоке, чтобы сигнализировать, что поток завершил задачу, и установить все дескрипторы чтения в функцию события (poll, epoll, select) в вашем главном поток, чтобы получить событие. Но я настоятельно рекомендую использовать библиотеки, которые я написал в посте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню