1

私は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 を使用して (または少なくとも生のスレッドを使用せずに) どのように解決しますか?

4

1 に答える 1