J'ai un wrapper autour d'un fichier std :: deque que j'utilise pour mettre en file d'attente des données audio (en entrant dans les blocs via libavcodec, si cela est important).Ajouter un bloc d'éléments à la fin de std :: deque
C'est la fonction qui prend un tampon de données 16 bits et ajoute à la deque
void AVAudioBuffer::enqueue(int16_t* src, size_t num, double pts) {
// Save current size of buffer
size_t size = data_buffer_.size();
lock();
data_buffer_.insert(data_buffer_.end(), src, src+num);
unlock();
// Push PTS value onto queue
if (pts != AV_NOPTS_VALUE) {
pts_values_.push_back(pair<int,double>(size, pts));
}
}
Définitions de verrouillage/déverrouillage:
void lock() { SDL_mutexP(mute_access_); }
void unlock() { SDL_mutexV(mute_access_); }
Mon problème est, lorsque le data_buffer_ L'instruction .insert est incluse dans le code, le thread dans lequel cette fonction se trouve s'exécutera une fois puis se verrouillera. Si je supprime le code, cela fonctionne. J'ai essayé de remplacer l'insertion par une itération manuelle des données src, en appelant push_back() pour chaque élément, ce qui provoque également le verrouillage du thread.
Est-ce une manière valide d'ajouter des données à un deque? Je l'ai essayé dans un programme de test et cela a semblé fonctionner correctement, et la documentation semble impliquer que tout va bien. Pourquoi cela ferait-il mourir mon fil?
Informations mises à jour: Des messages d'erreur ont été ajoutés lorsque le verrouillage/déverrouillage a échoué, et les deux réussissent très bien. Je les ai instrumentés pour vérifier qu'ils sont exécutés par paires, et ils le sont. Ça doit être quelque chose avec l'appel deque :: insert qui gâche les choses, je peux l'enlever et les choses bougent à nouveau.
Mise à jour: J'ai trouvé le problème, je refactorisé le code et a raté une constante de sorte que le dequeue vérifiait toujours aussi complète, ce qui provoque une boucle = (
Qu'entendez-vous par "provoque le thread à verrouiller"? Si vous le regardez dans le débogueur, où est-il "verrouillé" (callstack)? –
Désolé les fonctions lock()/unlock() sont des wrappers autour des mutex SDL, je mettrai à jour le poste avec leurs définitions. –
Pouvez-vous poster du code plus ou moins complet, y compris la partie deque et les fonctions de verrouillage/déverrouillage. Vous n'utilisez pas la taille et pts vars dans le code affiché, donc vous ne montrez probablement pas quelque chose d'important qui pourrait conduire à la découverte :) –