Запускать поток, когда элемент добавляется в очередь - PullRequest
0 голосов
/ 17 сентября 2018

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

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

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

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

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

0 голосов
/ 17 сентября 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...