나는 오디오 데이터를 대기열에 넣기 위해 사용하는 std :: deque에 대한 래퍼를 가지고있다. (중요하다면 libavcodec을 통해 블럭으로 들어온다.)std :: deque의 끝에 블럭 추가하기
void lock() { SDL_mutexP(mute_access_); }
void unlock() { SDL_mutexV(mute_access_); }
내 문제는 data_buffer_ :
이
16 비트 데이터의 버퍼를 취하고 양단 잠금/잠금 해제의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));
}
}
정의에 추가 기능이다 .insert 문이 코드에 포함되어 있으면이 함수가있는 스레드가 한 번 실행되고 잠길 수 있습니다. 코드를 제거하면 작동합니다. 삽입을 src 데이터의 수동 반복으로 바꾸고 각 요소에 대해 push_back()을 호출하여 스레드를 잠급니다.
이것은 양키에 데이터를 추가하는 유효한 방법입니까? 테스트 프로그램에서 시도해 보았지만 제대로 작동하는 것 같았습니다. 설명서에 문제가 없다는 것을 암시하는 것으로 보입니다. 왜 내 스레드가 죽을까요?
업데이트 정보 : 잠금/잠금 해제가 실패 할 때 추가 된 오류 메시지가 모두 잘 처리됩니다. 나는 그들이 쌍으로 처형 당하고 있는지 확인하기 위해 그들을 설치했다. 그것은 deque :: insert 호출로 뭔가를 엉망으로 만들고, 제거 할 수 있고, 다시 움직이기 시작합니다.
업데이트 : 나는 문제가, 내가 코드를 리팩토링과 상수는 그래서 디큐는 항상 루프 = (일부 스레드 잠금이 필요한 것처럼
"스레드가 잠기 게합니까?"라는 것은 무엇을 의미합니까? 디버거에서 보면, "잠긴"(콜 스택)은 어디입니까? –
죄송합니다. lock()/unlock() 함수는 SDL 뮤텍스를 둘러싼 래퍼입니다. 해당 정의로 게시물을 업데이트하겠습니다. –
deque 부분과 잠금/잠금 해제 기능을 포함하여 더 많거나 적은 코드를 게시 할 수 있습니까? 게시 된 코드에 크기 및 pts 변수를 사용하지 않으므로 검색으로 이어질 수있는 중요한 내용이 표시되지 않을 가능성이 높습니다. –