std::queue::push()
機能が正常にqueue
内の要素を挿入した後にcall_back function
が起動になるだろうように、我々はそれに私たちのcall_back function
参照をシンプルに置くことができるようなその中の任意のプレースホルダを持っていません。
std::queue::push(data)
{
//add data to internal container
//placeholder section--------
//invoke call_back function or event.
//placeholder section--------
}
ので、このようなプレースホルダが存在しない場合には、我々は自動call_back function
の呼び出しやRAIIを使用して、いくつかのイベントを試すことができます。
実際のデータをstruct
の中にラップすると、通知に役立つとします。次に、struct
のオブジェクトを介して間接的に実際のデータにアクセスする必要があります。今
struct data_notifier
{
//the true data.
int actual_data;
data_notifier(int data) : actual_data(data)
{
//signal event queue_full
//or
//call a call_back function.
}
}
int actual_data = 90;
std::queue<data_notifier*> q;
q.push(new data_notifier(actual_data));
、唯一の問題は、次のとおりです。data_notifier
のインスタンスが適切に参照/ポインタとしてqueue
に挿入される前に、私たちのcall_back
またはイベントが呼び出さなるだろう。イベントが呼び出されると、リーダーはデータを読み込もうとしますが、データがまだキュー内に保持されていないため、キューからデータを取得しません。 したがって、キュー内で適切に保持されているデータの保証は、std::queue::push()
関数が返された後にのみ可能です。Writer
関数内で発生する可能性があります。
//event_full is a manual event which needs to be signalled and non-signalled manually.
void Writer()
{
while(1)
{
//[1] wait for mutex_queue
//[2] myqueue.push(data);
//[3] data is now persisted so signal event_full
//[4] release mutex_queue
}
}
void Reader()
{
while(1)
{
//[1] wait for event_full (so no polling)
//[2] wait for mutex_queue
//[3] --- access queue ---
if(myqueue.size() != 0)
{
//process myqueue.front()
//myqueue.pop();
}
if(myqueue.size() == 0)
{
//reset event_full
//so as long as queue has data, Reader can process it else needs to wait.
}
//[3] --- access queue ---
//[4] release mutex_queue
}
}
適切なSTLコンテナまたはパターンをお探しですか? –
@RawN明らかに、STLに既にコンテナがある場合は、それを実装する方法が良いでしょう。 – mans
キューがあり、デキューがあります。既存のクラステンプレートから継承することを検討している場合 - そうしないでください。 –