TL;DR

プロセスの実行単位。同じプロセス内のスレッドはメモリ空間を共有するので、異なるスレッドから同じデータにアクセスできる。

仕組み

プロセスは、メインスレッド(プライマリスレッド)と呼ばれる 1 つのスレッドで開始する。スレッドを 1 つだけ持つプロセスをシングルスレッド、複数持つプロセスをマルチスレッドと呼ぶ。

プロセスどうしはメモリ空間が分かれているが、スレッドどうしはメモリ空間を共有する。そのため、複数のスレッドから同じデータにアクセスするときは、アクセスの順序を意識する必要がある。

例

アクセスの順序を意識しないと、競合状態やデータ競合が起きる。競合状態の例に ABA 問題がある。

あるデータを初期化し、もう一度同じデータを読んで値を確かめるプログラムを、スレッド A で実行するとする。このとき、別のプログラムがスレッド B で動いていて、同じデータを書き換えたとする。書き換えがスレッド A の初期化と読み込みの間に起きると、スレッド A のプログラムからは、データが勝手に書き換わったように見える。

注意点

このような問題を防ぐため、複数のスレッドを扱うときはロックなどを使う。ただし、ロックを使うとデッドロックなど別の問題が起きるので、いずれにせよ細心の注意が必要である。この理由から、Clojure は STM を採用している。

関連

出典