Завершение программы при обращении к переднему пакету в очереди - PullRequest
0 голосов
/ 04 июля 2018

У меня есть 2 потока для декодирования потокового видео RTSP, мой код, как показано ниже:

    int key = 0;
    std::queue<AVpacket> Packet_buf;

    int thread1 (void) 
    {
           AVPacket packet;
           packet = read_packet();
           Packet_buf.push(packet);
           av_packet_unref(&packet);
           key = 1;
    }

    int thread2 (void)
    {
          AVPacket *packet;
          while(key==0) {} // wait to read the first packet
          *packet = Packet_buf.front(); // program halt here
          avcodec_send_packet(pCodecCtx,packet);
    }

    int main();
    {
         thread p1(thread1);
         thread p2(thread2);
    }

Мой сбой программы в строке: * packet = Packet_buf.front ();

Можете ли вы помочь мне найти проблему, спасибо!

1 Ответ

0 голосов
/ 05 июля 2018

Ваш код имеет больше проблем, некоторые из них:

1) std::queue<AVpacket> Packet_buf;

Я думаю, это будет:

std::queue<AVPacket> Packet_buf; заметка AVpacket и AVPacket - это совсем другое. (Да, я думаю, это просто опечатка).

2) while(key==0) {} Это не хороший способ ждать изменения переменной. Особенно, если переменная (ключ) не volatile. Это может работать и, вероятно, работает. Но я предлагаю вместо этого использовать переменные pthread signal и cond. Также проверьте следующую проблему (3), которая тесно связана.

3) *packet = Packet_buf.front(); Вызов std::queue.front() перед проверкой, является ли контейнер empty() или нет, НЕ является хорошей идеей. Если контейнер (очередь) пуст, чем метод front(), это приведет к неопределенному поведению.

Надеюсь, это поможет.

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