現在、ビデオ画像を圧縮するためにnvidiaハードウェアエンコーダで見つかったコードをリファクタリングしています。元の質問はここにある:回答に基づいてwondering if I can use stl smart pointers for thisスレッドセーフなバッファ配列
は、次のように私は自分のコードを更新しました:
回答やコメントに基づいて、私はスレッドセーフバッファ配列を作成しようとしています。ここにあります。コメントしてください。
#ifndef __BUFFER_ARRAY_H__
#define __BUFFER_ARRAY_H__
#include <vector>
#include <mutex>
#include <thread>
template<class T>
class BufferArray
{
public:
class BufferArray()
:num_pending_items(0), pending_index(0), available_index(0)
{}
// This method is not thread-safe.
// Add an item to our buffer list
// Note we do not take ownership of the incoming pointer.
void add(T * buffer)
{
buffer_array.push_back(buffer);
}
// Returns a naked pointer to an available buffer. Should not be
// deleted by the caller.
T * get_available()
{
std::lock_guard<std::mutex> lock(buffer_array_mutex);
if (num_pending_items == buffer_array.size()) {
return NULL;
}
T * buffer = buffer_array[available_index];
// Update the indexes.
available_index = (available_index + 1) % buffer_array.size();
num_pending_items += 1;
return buffer;
}
T * get_pending()
{
std::lock_guard<std::mutex> lock(buffer_array_mutex);
if (num_pending_items == 0) {
return NULL;
}
T * buffer = buffer_array[pending_index];
pending_index = (pending_index + 1) % buffer_array.size();
num_pending_items -= 1;
return buffer;
}
private:
std::vector<T * > buffer_array;
std::mutex buffer_array_mutex;
unsigned int num_pending_items;
unsigned int pending_index;
unsigned int available_index;
// No copy semantics
BufferArray(const BufferArray &) = delete;
void operator=(const BufferArray &) = delete;
};
#endif
私の質問は、ここでいくつかのC++の優れた推奨事項を壊しているかどうかです。また、クラスにアクセスして複数のスレッドを使用できるように、クラスを拡張しています。私が逃したかもしれないものがあるかどうか疑問に思っていた。 2.で、「処理」とは、単にint型に乗じている。このテストでは
しかし、プロセッサのスレッドが保留キューから保留中のデータをとる方法のプロセスに注目してください:
あなた '追加()'スレッドセーフではありません。また、ロックガードが必要です。さもなければ、質問はあまりにも漠然としたものではありません。 –
質問には関係ありませんが、二重下線で始まる記号、またはアンダースコアの後に大文字が続く記号は、すべてのスコープで予約されています。詳細については、[この古い回答](http://stackoverflow.com/a/228797/440558)を参照してください。 –
@JoachimPileborgしかし、私は一重または二重のアンダースコアで始まるものは使用していませんか?インクルージョンガードを意味しますか? – Luca