Thread

システムは、pthreadをサポートします。pthreadインターフェースを理解すると、posixインターフェースを使用してスレッドを実装することもできます。また、pthreadのラッパークラスを提供します。ここでは、次の3つの部分が含まれます。

  • Thread.h:Thread class
  • Mutex.h:Mutex class
  • Condition.h:Condition class

使い方

  1. ヘッダファイルをインクルードした後、Threadクラスを継承してvirtual bool threadLoop()関数を実装します。また、必要に応じてreadyToRun()関数を実装します。

     #include <system/Thread.h>
    
     class MyThread: public Thread {
     public:
       /**
        * After the thread is created successfully, this function will be called, and some initialization operations can be done 
        * in this function
        * return true   Continue thread
        *        false  Exit thread
        */
       virtual bool readyToRun() {
         LOGD("Thread has been created");
         return true;
       }
    
       /**
        * Thread loop function
        *
        * return true  Continue thread loop
        *        false Exit thread
        */
       virtual bool threadLoop() {
         LOGD("Thread loop function");
    
         //Check if there is a request to exit the thread, if so, return false and exit the thread immediately
         if (exitPending()) {
           return false;
         }
    
         //Accumulate the count and display it on the screen
         loop_count += 1;
         mTextView2Ptr->setText(loop_count);
    
         //To observation, add sleep 500ms here
         usleep(1000 * 500);
    
         //Return true, continue the next thread loop
         return true;
       }
     };
    
  2. Thread objectインスタンス化

    static MyThread my_thread;
    
  3. Thread開始
     //Call the run function of the thread class to start the thread
     //The parameter is the thread name, which can be arbitrarily specified.
     my_thread.run("this is thread name");
    
  4. Thread終了 Threadクラスは、同期または非同期の両方の関数としてthreadを終了することができ、違いは次のとおりです。

    • void requestExitAndWait()
      //Request to exit the thread and wait. The function does not return until the thread completely exits
      my_thread.requestExitAndWait();
      
    • void requestExit()

      //Request to exit the thread, the function returns immediately after sending the request but at this time, it does not mean 
      //that the thread has also exited
      my_thread.requestExit();
      

      上記の二つの関数のいずれかを呼び出した後threadLoop関数でbool exitPending()のメンバー関数を使用してスレッド終了要求があるかを確認することができます。

      virtual bool threadLoop() {
       LOGD("Thread loop function");
      
       //Check if there is a request to exit the thread, if so, return false and exit the thread immediately
       if (exitPending()) {
         return false;
       }
       return true;
      }
      

      [!Note] 上記の関数は、threadを強制的に終了せずにthread終了を要求する表示を追加します。 threadLoop関数で特定のタスクを実行しており、threadLoop関数が終了していない場合は、threadが停止されません。 正しいアプローチは、threadLoopでthread終了要求を確認するか、終了条件を確認し、falseを返すことです。


[!Warning] threadLoop関数でrequestExitAndWaitrequestExit関数を呼び出すことは、デッドロックを引き起こす可能性があり、禁止されています。

  1. Threadが実行されていることを確認
    if (my_thread.isRunning()) {
     mTextView4Ptr->setText("Now running");
    } else {
     mTextView4Ptr->setText("Already stop");
    }
    

Threadプロセス

上記の手順をフローチャートと理解すれば、より簡単に深く理解できます。

Sample code

詳細については、Sample CodeThreadDemoプロジェクトを参照してください。

powered by Gitbooklast modified: 2020-12-08 11:24:07

results matching ""

    No results matching ""