Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【小ネタ】スレッドってなんだろう?という話

More than 1 year has passed since last update.

最初に

本記事は「スレッド」について少し掘り下げての解説記事となります。

プロセスについては→【小ネタ】プロセスってなんだろう?という話
並列処理・並行処理については→【小ネタ】並列処理とは何か?そして並列処理と並行処理の違いとは?
非同期については→Unity非同期完全に理解するための第一歩~非同期処理とは何か~

スレッドとは?

スレッドとはプロセス内に作られる並列処理を行うための仕組みであり、処理の単位です。

シングルスレッドなら1プロセスに1スレッド、マルチスレッドなら1プロセスで複数のスレッドが動作しています。ただしその実行管理(スケジューリング)はOS側で行います。

スレッドはプロセスに割り当てられたメモリを使用して動作しています。スレッド同士ではメモリを共有しているため、メモリの切り替えも含めたプロセスの切り替えに比べると、スレッドの切り替えは高速に動きます。ただし、メモリを共有しているということは、ほとんどのデータをスレッド同士で共有しているということで、同じ変数に対してスレッド同士が同時に値を書き換えようとする場合に開発者側が意図していない状況になることが殆どです。なので、マルチスレッドプログラムを開発するのであれば、このような問題が起きない(スレッドセーフ)ようなプログラムを意識する必要があります。

また、共有メモリへのアクセス速度は、非共有メモリへのアクセスより何倍も遅くなります

スレッドの使い方

ほとんどのOSがOS依存ライブラリでスレッドを用意します。ゲームエンジンなどでも基本的にはスレッドを用意できるAPIが提供されています。

スレッド制御用のAPIを使用することでスレッドの制御を開始、一時停止、終了を行わせることができます。またマルチスレッドであれば、全てのスレッドの処理が終わるまで待つこともできます。ただしスレッドをどのように実行させるかまでは制御できません。

ゲームエンジンでのスレッド

ゲームエンジンではマルチタスク処理の方法の一つとして、エンジンのサブシステム毎にスレッドを割り当てて実行する方法があるようです。この場合、メインスレッドではメインのゲームループを処理しつつ、サブシステムの処理をコントロールして同期させます。

このようなアーキテクチャは基本的に、プロセスが動作対象とするハードウェア上にある何らかのスレッドライブラリによってサポートされています。PS3ならSPURS、UnityやUE4で開発するならエンジン側でAPIを用意してくれています。

昔のスレッド

昔、スレッドは「ライトウェイトプロセス」とも呼ばれていました。由来はUNIXであり、もともとUNIXにはプロセスしかなく、並列処理を行うためには一つのプロセスから子プロセスを作成していました。しかしこれでは環境をコピーするコストが大幅にかかり、切り替え速度も遅いため、高速で切り替えが可能で軽量なプロセスとしてスレッドが導入されました。Windowsはこれに習い、プロセスとスレッドを導入しました。

参考

4_mio_11
スローペースで生きてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away