スレッドとタスクの違いについてしらべてみた(C++/Linux)

    今日、タスクとスレッドの違いについて質問された。

    うまく説明できなかった。

    人間失格。

    ということで、ここで反省しようと思う。

    タスクとスレッドの定義について

    Wikipediaから引用する。

    スレッド

    スレッド(thread)とは、CPU利用の単位。
    プロセスに比べて、プログラムを実行するときのコンテキスト情報が最小で済むので切り替えが早くなる。
    スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。

    ある処理を単一のスレッドのみを用いて動作させる環境もしくは手法をシングルスレッドという。
    対して、複数のスレッドが同時に動作することをマルチスレッドという。
    プログラム(概ねプロセス)の開始時にはメインとなるスレッドが動作する。
    必要に応じてその他の処理をするスレッドを作り、実行させる事も出来る。

    タスク

    1つのタスクは、1つ以上のプロセスから構成され、1つのプロセスは、1つ以上のスレッドから構成される。

    プロセスと同義。スレッド (コンピュータ)と同義。タスク並列性などの用語では両者を区別しない場合もある。

    OSから見た処理の実行単位。
    通常はスレッドが実行単位となるが、OSによってはプロセス(複数のスレッドを含むプログラム全体)を1つの実行単位としてみる場合もある。
    一つのアプリケーションソフトが行っている作業全体を一つのタスクと扱う場合が多く、この場合は「プロセス」に近い意味合いになる。

    調査結果

    わからん。

    C++からアプローチ

    C++11では、threadライブラリがあるので、使ってみる。

     g++ thread.cpp  -pthread -std=c++11 -Wl,--no-as-needed
    

    実装結果

    わからん。

    タイマをつかって比べてみる

    タイマをつかってみた。

    スレッドライブラリをつかったマルチスレッドプログラムは5秒かかる。

    スレッドライブラリをつかってないシングルスレッドプログラムは15秒かかる。

    実装結果

    ちょっとわかった。

    まとめ

    C++/Linux環境だと、コンパイルした a.outを実行したものがタスク(プロセス?)

    % ./a.out &
    % ps
      PID TTY          TIME CMD
    11484 pts/5    00:00:00 a.out
    

    ひとつのプログラムのなかに複数のスレッドが動ける。

    これはシングルスレッドかつシングルタスク。

    
    int main()
    {
      std::cout << "hello thread" << std::endl;
      return 0;
    }
    

    これはマルチスレッドかつシングルタスク。

    
    int main()
    {
      thread th(  std::cout << "hello thread" << std::endl; );
      thread th2(  std::cout << "hello thread" << std::endl; );
      th.join();
      th2.join();
      return 0;
    }

    これはマルチタスク。

    
     % ./a.out &
     % ./a.out &
     % ps
      PID TTY          TIME CMD
     8668 pts/5    00:00:00 a.out
     8874 pts/5    00:00:00 a.out
    

    結論

    結局、わからん。