私はpplを学ぼうとしています。スレッドを使用する代わりに。最初から持っていきましょう。私はこの単純な問題を抱えています:
v1:
while(true)
{
auto important_msg = ReceiveImportantMessage_Blocking(); //Blocks for about 20s until there is a new message
//do processing on important_msg
auto unimportant_msg = ReceiveUnimportantMessage_Blocking(); //Blocks for about 60s until there is a new message
//do processing on unimportant_msg
}
これらの呼び出しは両方ともブロックされ、互いに待機することになるため、v1 は明らかに悪いです。
v2:
while(true)
{
auto important_msg = ReceiveImportantMessage_Blocking(); //Blocks for about 20s until there is a new message
//do processing on important_msg
auto unimportant_msg = CheckForUnimportantMessage_NonBlocking(); //works by polling queue. Returns empty if no message
if(unimportant_msg) {
//do processing on unimportant_msg
}
}
重要でないメッセージが重要なメッセージをブロックしないため、v2 の方が優れています。また、重要なメッセージは、受信後にインスタンスで処理されます。重要でないメッセージは、重要なメッセージを受信する前にチェックされません。したがって、重要でないメッセージは、私がそれに到達するまでに 20 代になる可能性があります。
v3:
while(true)
{
auto important_msg = CheckForImportantMessage_NonBlocking(); //works by polling queue. Returns empty if no message
if(important_msg) {
//do processing on important_msg
}
auto unimportant_msg = CheckForUnimportantMessage_NonBlocking(); //works by polling queue. Returns empty if no message
if(unimportant_msg) {
//do processing on unimportant_msg
}
sleep(10); //just so we don't busy wait.
}
v3 は、重要でないメッセージをより迅速に取得します。ただし、重要なメッセージの場合は遅くなります。重要なメッセージの処理は、受信後すぐには行われません。しかし、私がそれを確認するために周りにいるときだけです。ビジーな待機 (および CPU 時間を消費しすぎる) を避けるためにスリープを追加したため、重要なメッセージの受信と処理に v2 よりも時間がかかります。
v4:
{
auto important_msg_task = ReceiveImportantMessageTask_NonBlocking(); //ppl::task
auto unimportant_msg_task = ReceiveUnimportantMessageTask_NonBlocking(); //ppl::task
while(true)
{
if(important_msg_task.is_done()) {
auto important_msg = important_msg_task.get();
//do processing on important_msg
important_msg_task = ReceiveImportantMessageTask_NonBlocking(); //listen for new message
}
if(unimportant_msg_task.is_done()) {
auto unimportant_msg = unimportant_msg_task.get();
//do processing on important_msg
unimportant_msg_task = ReceiveUnimportantMessageTask_NonBlocking(); //listen for new message
}
sleep(10); //just so we don't busy wait.
}
}
V4 は v3 と同じです。代わりに ppl タスクを使用します。受信した重要なメッセージをすぐに処理しないという問題があります。
v5) スリープを解除し、important_msg_task ".then" を使用して受信したら処理を開始し、".then" は古いメッセージが処理されたら新しいメッセージをリッスンし、".then" はそのメッセージを処理します。新しいメッセージなど (unimportant_msg_task についても同じことを行います)。ループ内でこれを行う方法がわかりません。接続されたタスクのチェーンが次々と成長し、永遠に終わるだけのようです。
では、この問題を ppl を使用して (または少なくとも生のスレッドを使用せずに) どのように解決しますか?