2

オーディオデータをキューに入れるために使用している std::deque のラッパーがあります (問題がある場合は、libavcodec を介してブロックに入っています)。

これは、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));
  }
}

ロック/ロック解除の定義:

void   lock()     { SDL_mutexP(mute_access_);     }
void unlock()     { SDL_mutexV(mute_access_);     }

私の問題は、 data_buffer_.insert ステートメントがコードに含まれている場合、この関数が含まれているスレッドが一度実行されてからロックアップすることです。コードを削除すると、機能します。挿入を src データの手動反復に置き換えて、要素ごとに push_back() を呼び出してみましたが、これもスレッドがロックされます。

これは両端キューにデータを追加する有効な方法ですか? テスト プログラムで試してみたところ、問題なく動作しているように見えました。これにより、スレッドが停止するのはなぜですか?

更新された情報: ロック/ロック解除が失敗した場合のエラー メッセージを追加し、どちらも問題なく成功しました。それらがペアで実行されていることを確認するためにそれらをインストルメント化しました。deque::insert 呼び出しで問題が発生している必要があります。それを削除すると、再び動き出すことができます。

更新: 問題が見つかりました。コードをリファクタリングし、定数を逃したため、デキューが常に満杯としてチェックされ、ループ =( が発生しました。

4

3 に答える 3

0

スレッドロックが必要なようです。別のスレッドがキューから読み取っている(したがって更新している)場合は、ロックする必要があります

おっと - そこにロックがあります。私の推測では、ロックが機能していないか、リーダーがロックしていません。

リーダースレッドもロックしますか? ロックが実際にロックされていると確信していますか?

于 2010-01-13T01:53:05.360 に答える