👾

マルチスレッドとは

2023/07/25に公開

マルチスレッドとは?

コンピュータプログラム内で2つ以上のタスク(スレッド)が同時に実行される技術を指します。
マルチスレッドの主な目的は、プログラムの並行性と効率を向上させることです!

一般的に、スレッドはプロセス内の実行の単位で、それぞれが独自のプログラムカウンタ、
レジスタセット、およびスタックを持っています。

しかし、同じプロセス内のスレッドは、ヒープメモリなどのリソースを共有します。
これにより、スレッド間でのデータの共有と通信が比較的容易になります。

https://wa3.i-3-i.info/word12455.html

説明
プロセス 実行中のプログラムのインスタンス。各プロセスには独自のメモリ空間と必要なリソースが割り当てられます。
スレッド プロセス内の実行の単位。複数のスレッドが同一のメモリ空間を共有できます。
プログラムカウンタ 次に実行する命令のアドレスを指すレジスタ。
スタック 一時的なデータを保存するためのメモリ領域。関数の呼び出しとリターンに使われます。
ヒープメモリ コンピュータプログラムが実行時に使用するメモリの一部。動的なメモリ割り当てに用いられます。

マルチスレッドは以下のような場面で役立つ!

UIとバックグラウンドタスク

UI(User Interface)を持つアプリケーションでは、
バックグラウンドでのデータ処理とUIの更新を同時に行うことが可能です。

これにより、重い処理が行われている間でもUIがフリーズすることなく
ユーザーはアプリケーションと対話し続けることができます。

例えば
  • あるウェブブラウザーのタブで長い記事を読んでいるとき、
    他のタブで動画をバックグラウンドでダウンロードしたいとなった時。

  • ダウンロードプロセスはバックグラウンドタスクとして実行され、
    ユーザーは記事を読み続けることができます。

  • ダウンロードが完了したら、ユーザーに通知を送るか、
    ダウンロードが完了したことを示すUIの変更が行われます!

パフォーマンスの向上

マルチコアまたはマルチプロセッサーシステムでは、複数のスレッドを同時に実行することで、
システムのパフォーマンスを向上させることが可能です。

I/O操作

一部のスレッドがI/O操作(ディスクへの書き込み、ネットワークからの読み取りなど)で
ブロックされている間も、他のスレッドは実行を続けることができます。

ただし、マルチスレッドには潜在的な問題も存在します。
複数のスレッドが共有データにアクセスすると、データの整合性が失われる可能性があります。

これを防ぐために、排他制御(mutexやsemaphoreなど)を用いて
データへのアクセスをコントロールする必要があります。

また、スレッドの作成と管理にはコストがかかるので、それも考慮する必要があります。

排他制御とは
  • 排他制御(Mutual Exclusion)は、共有リソースへの
    同時アクセスを防ぐための手法の一つです。

  • これは、一度に1つのプロセスまたはスレッドだけが
    そのリソース(例えば、データベースの特定のレコード、共有メモリ領域、ファイルなど)に
    アクセスできるようにすることを意味します。

  • 排他制御がないと、複数のプロセスまたはスレッドが同時に共有リソースに書き込むと、
    データの整合性が破壊される可能性があります。

  • 例えば、銀行の口座残高を2つの異なるプロセスが同時に更新しようとすると、
    どちらの更新も正しく反映されない可能性があります。
    このような問題を 「競合状態(Race Condition)」 と呼びます。

  • 排他制御は、セマフォア、ミューテックス(Mutex)、
    モニターなどの同期原理を用いて実装されます。

  • これらの原理は、リソースへのアクセスをコントロールし、
    一度に一つのプロセスまたはスレッドだけがリソースを使用できるようにすることで、競合状態を防ぎます。

マルチスレッドをサポートしているさまざまなプログラミング言語

Java

Javaは最初からマルチスレッドをサポートして設計されており、
スレッドの作成、終了、同期などを直感的に制御できる高レベルのAPIを提供しています。

C++

C++11から標準ライブラリとしてマルチスレッドをサポートしています。

Python

Pythonではthreadingモジュールを使用してマルチスレッドを実装できますが、
GIL(Global Interpreter Lock)により同時に実行できるスレッドが一つだけなので、
CPUバウンドなタスクには向いていません。I/Oバウンドなタスクには有用です。

JavaScript(Node.js)

Node.jsはシングルスレッドで動作しますが、worker_threadsモジュールを使うことでマルチスレッドを実現できます。

これら以外にも多くの言語がマルチスレッドをサポートしています。
ただし、マルチスレッドの使用はコードの複雑性を増すため、慎重に設計と実装を行う必要があります。

Discussion