Я разрабатываю приложение для Windows на C ++ в VS2017. Мне нужно выполнить обработку некоторых данных (хранящихся в очереди) в потоке, но только тогда, когда элементы существуют в очереди.

thread
{
if(!queue.empty()
{
//process data and pop out 
}
}

Но есть вероятность, что очередь может быть пустой и иногда иметь данные, так как я могу этого добиться?

Я попытался запустить весь цикл в потоке, но это неэффективно, и оптимизированное рекламное приложение перестает отвечать через некоторое время.

 thread
{
    while(true)
    {
        if(!queue.empty()
        {
            //process data and pop out 
        }
    }
}

Пожалуйста, поддержите и помогите узнать, как это можно сделать эффективно?

0
pushE 17 Сен 2018 в 07:33

2 ответа

Лучший ответ

То, что вы ищете, называется condition_variable. Это позволит вашему рабочему потоку приостановиться, когда ему нечего делать, а затем возобновить его, как только другой поток вставит что-то в очередь (и уведомит вашу condition_variable о разблокировке).

Примеры здесь и здесь лучше, чем все, что я мог бы написать.

1
selbie 17 Сен 2018 в 05:02

Ответ от @selbie помог сделать это следующим образом

thread
{
    while(true)
    {
        if(condition_varibale not TURE wait here)

        if(!queue.empty()
        {
            //process data and pop out 
        }
    }
}

Обновлять переменную условия при добавлении элементов в очередь.

0
pushE 17 Сен 2018 в 07:00