Устранение проблемы:std :: Thread занимает больше времени, чтобы пробудиться от ожидания на std :: condition_variable?
У меня есть потребительский поток производителей, совместно использующий общие данные, которые представляют собой не что иное, как структуру. Потребительский поток ожидает переменную std :: condition wait. потоки производителя возвращают пакет, записывающий общий struture и уведомляющий потребительский поток.
проблемы: потребительский поток должен обрабатывать и отправлять ответ с несколькими миллисекундами (скажем, 10-15 мс).
Проблема. В течение некоторого периода времени существует несколько случаев, когда сама ветка принимает время, чтобы проснуться от ожидания cv и, таким образом, не в состоянии отклик в течение нескольких мс.
Я попытался использовать доходность, но это заставляет процессор, и требование заключается в том, что использование процессора должно быть как можно меньше.
Я интересуюсь: 1 - Почему поток занимает столько времени, чтобы проснуться .. ?? (в некоторых случаях более 40 мс). 2 - Есть ли другой способ совместного использования данных между потоками, не позволяя нить спать, а также используя минимальный процессор. (Пробный канал, но снижает производительность по сравнению с текущей реализацией разделяемой памяти).
3 - предлагайте любой другой дизайн, который может не содержать темы, которые по-прежнему сохраняют проблемы отдельно и достигают необходимой задержки. ????
Это общие данные:
class Message
{
typedef std::basic_string<uint8_t> MesgBuffType;
MesgBuffType _buffer;
static uint16_t _data[256];
public :
append(data .....,len) append methods
}
void ProcessData(Messege msg)
{
std::unique_lock<std::mutex> lock(mutex);
sharedData.set(msg);
lock.unlock();
_syncCondVar.notify_one();
}
void consumeData()
{
std::unique_lock<std::mutex> lock(mutex);
_syncCondVar.wait(lock);
Messege req;
if (sharedData.get(req))
{
lock.unlock();
processRequest(req);
}
}
Добавлено поддержку кода.
Пожалуйста, не забывайте указать операционную систему и компилятор вы используете, –
окружающую среду это Windows с VS2013. – VikramChopde
Вы пытались переместить 'lock.unlock' после' notify_one'? –