Избегайте занятого ожидания в этой ситуации

У меня есть процесс, который использует разные потоки для выполнения разных типов заданий.

Один такой поток должен отправлять push-уведомления неблокирующим образом (поэтому я буду использовать libcurl из-за мультиинтерфейса и поддержки SSL). Главный поток должен передать задание рабочему, и я подумал об использовании очереди сообщений apache apr для передачи сообщений. Поскольку в этом же потоке я должен проверять входящие сообщения и наличие дескрипторов curl, я думаю, что я буду использовать что-то вроде этого:

while (1)
{
    while (apr_queue_try_pop(queue, &msg) == APR_SUCCESS)
    {
        // do something with the message
    }

    // perform a select or poll in the curl multi handle
    // treat the handles that are available for reads/writes
}

в функции запуска потока.

Это какое-то занятое ожидание, есть ли лучшее решение?

Использование C99 и Linux x86_64.


person Victor Dodon    schedule 24.09.2013    source источник


Ответы (1)


Точно ответить на ваш вопрос сложно, просто мало информации. Но, если код, который вы показываете, является рабочим кодом, т.е. запущенным в потоке, и необходимость пуша уведомлений возникает часто, то я не вижу причин, по которым это не сработает. Что касается вашего вопроса Это своего рода занятое ожидание, есть ли лучшее решение? Обычно я делаю что-то, чтобы поток простаивал после завершения задачи, за которую он отвечает, например, использую спать(1000). Оставшаяся часть кванта времени потока не используется в цикле. Нравится:

while (1)
{
    while (apr_queue_try_pop(queue, &msg) == APR_SUCCESS)
    {
        // do something with the message
    }

    // perform a select or poll in the curl multi handle
    // treat the handles that are available for reads/writes
    Sleep(1000);
}
person ryyker    schedule 24.09.2013