Open5

並行並列処理について

takumitakumi

学習すること

  • 並行並列処理とは何なのか
  • マルチプロセスとマルチスレッドとの違い
  • マルチコアとの関係
takumitakumi

並行処理と並列処理

こちらの書籍で学習する
https://www.amazon.co.jp/Linuxとpthreadsによる-マルチスレッドプログラミング入門-プログラミング基礎講座-渋谷-克智/dp/4798053724

タスク実行方法の概念

逐次処理・並行処理・並列処理の3つの概念を説明

逐次処理(シーケンシャル)

名前の通りタスクを順番に一つずつ実行する方法。
一つの処理が終わったら次の処理が実行される。

並行処理(コンカレント)

シングルコアの場合に、複数のタスクのコンテキストを高速に入れ替えながら実行する方法。
ある時点においては一つのタスクしか実行していない。

並列処理(パラレル)

マルチコアを用いて複数タスクを真に同時に実行する方法

コンテキストとは

何らかのタスクで使用されるデータの状態。
タスクAが中断された場合、タスクAを再開するために中断された時点までのプログラムの実行状態を保存する必要がある。

takumitakumi

chapter1 まとめ

  • コンピュータ上で複数のコードを実行する仕組みをマルチタスクと呼ぶ
  • 実行単位がスレッドの場合、マルチスレッド
  • 実行単位がプロセスの場合、マルチプロセス
  • スレッド間では計算資源(要調査)を共有するためスレッドセーフにすることが大切
  • マルチタスクの場合はタスクの実行をCPUが高速で切り替えており、これを「コンテキストスイッチ」と呼ぶ

「マルチスレッド/マルチプロセス・並列/並行」に関しては以下の記事がわかりやすかった
https://zenn.dev/chro96/articles/abcda94d41697b

takumitakumi

chapter2まとめ

  • pthread_create関数でスレッドを作成できる

  • pthread_exit関数でスレッドを終了できる

  • プロセスが終了するとプロセス内のスレッドは強制的に終了する

    • exitで終了
  • q) プログラム開始時に生成されるスレッドとpthread_createで生成したスレッドは対等ではないのでは?
    以下のようなコードの場合、threadFuncで8秒の処理が行われているが、main関数の処理(メインスレッド)が5秒なのでthreadFuncもそれと同時に終了する。このコードではメインスレッドの終了が優先されているので、プログラム開始時に生成されるスレッドが優先される?

#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

void *threadFunc(void *arg) {
  for (int i = 0; i < 8; i++) {
    printf("threadFunc %d\n", i);
    sleep(1);
  }
  return NULL;
}

int main() {
  pthread_t thread;

  if (pthread_create(&thread, NULL, threadFunc, NULL) != 0) {
    printf("Error: Failed to create thread\n");
    exit(1);
  }

  for (int i = 0; i < 5; i++) {
    printf("main thread %d\n", i);
    sleep(1);
  }

  return 0;
}