ロゴ
ユニオンペディア
コミュニケーション
Google Play で手に入れよう
新しい! あなたのAndroid™デバイスでユニオンペディアをダウンロードしてください!
インストール
ブラウザよりも高速アクセス!
 

スレッドセーフ

索引 スレッドセーフ

レッドセーフ(Thread-safe)は、マルチスレッドプログラミングにおける概念である。あるコードがスレッドセーフであるという場合、そのコードを複数のスレッドが同時並行的に実行しても問題が発生しないことを意味する。特に、ある共有データへの複数のスレッドによるアクセスがあるとき、一度に1つのスレッドのみがその共有データにアクセスするようにして安全性を確保しなければならない。 スレッドセーフはマルチスレッドプログラミングにおける重要な要素である。それは従来、オペレーティングシステムの開発者だけが考慮しなければならない問題だったが、1990年代後半には一般的な問題となった。マルチスレッドプログラムでは、複数のスレッドが同じアドレス空間内で同時に実行される。各スレッドのアクセスするメモリ領域が特に制限されることはなく、全スレッドが全アドレス空間にアクセスできる。従って、プログラムを見たときに予測される制御の流れやデータアクセスの順序は実際に実行時に起きることとかけ離れたものとなることが多い。これは「驚き最小の原則」に反している。スレッドセーフは実際の処理の流れとプログラムのソースコードの関連性を強化し、予期しない動作を最小にすることを指向した特性である。.

28 関係: 参照 (情報工学)不可分操作並行性制御引数例外処理ミューテックスポインタ (プログラミング)ライブラリリエントラントプログラミング (コンピュータ)プロセスファイル (コンピュータ)アドレス空間オペレーティングシステムグローバル変数コールスタックシリアライズスレッド (コンピュータ)スレッド局所記憶優先順位の逆転副作用 (プログラム)動的メモリ確保C言語計算資源驚き最小の原則関数 (数学)HP-UX排他制御

参照 (情報工学)

参照(さんしょう、reference、リファレンス)は、他の場所にあるデータを指している情報を含む小さなオブジェクトであり、それ自身の中に(指している)データ自体を含まない。参照の指す値を取り出すことをデリファレンス (dereference)と呼ぶ(間接参照も参照)。参照は様々なデータ構造を構成する基本要素であり、プログラム内の各部で情報をやり取りするための基本でもある。 なお、C++には、参照型というものがあるが、以下で説明するのはC++のそれではなく、一般概念である。C++の参照については、ポインタ (プログラミング)#参照を参照のこと。.

新しい!!: スレッドセーフと参照 (情報工学) · 続きを見る »

不可分操作

不可分操作(ふかぶんそうさ)あるいはアトミック操作 (atomic operation) とは、情報工学においていくつかの操作を組み合わせたもので、システムの他の部分から見てそれらがひとつの操作に見えるものをいう。.

新しい!!: スレッドセーフと不可分操作 · 続きを見る »

並行性制御

情報技術および計算機科学における並行性制御(へいこうせいせいぎょ、Concurrency Control)または同時実行制御(どうじじっこうせいぎょ)とは、特にプログラミングとOSとマルチプロセッシングとデータベースにおいて、並行処理の結果が可能な限り素早くかつ正しく得られることを保証することである。 コンピュータシステムは、ソフトウェアもハードウェアも、モジュールまたはコンポーネントで構成される。各コンポーネントは何らかの一貫性規則に従って正しく動作するよう設計されている。コンポーネント間でメッセージをやり取りするか(記憶装置内で)データを共有して並行動作する際、あるコンポーネント間の一貫性が他のコンポーネントによって妨害されることがある。並行性制御の一般的な領域は、同時並行的に相互作用しながら動作するコンポーネント間の一貫性を保つための規則、技法、設計方法論、理論を提供し、結果としてシステム全体の一貫性と正確性を提供する。並行性制御をシステムに導入することは、一般に若干の性能低下を生じる操作上の制約を適用することを意味する。操作一貫性と正確性は、妥当な以上の性能低下を伴わずに可能な限り効率的に達成されるべきである。.

新しい!!: スレッドセーフと並行性制御 · 続きを見る »

引数

引数(ひきすう)は、数学における関数やコンピュータプログラムにおける手続きにおいて、その外部と値をやりとりするための特別な変数、あるいはその変数の値のことである。 数学や最適化問題に関するそれ(「パラメータ」とカタカナで表現されることが多い)については「媒介変数」の記事を参照のこと。以下は専らコンピュータプログラミングに関して説明する。 関数・サブルーチン・メソッド等を定義する時に、外部から値を渡される特別な変数として指定されるのが仮引数。関数(等)を呼出す式において、仮引数に対応する式(あるいはその値)が実引数である。実行時には、実引数の値を仮引数が受け取る。 「引数」を「いんすう」と読む読み方もあるが、術語としては変則的に湯桶読みして「ひきすう」としている。数学分野で因数との取違えを防ぐためといった理由もある。.

新しい!!: スレッドセーフと引数 · 続きを見る »

例外処理

例外処理(れいがいしょり)とは、プログラムの上位の処理から呼び出されている下位の処理で継続不能、または継続すれば支障をきたす異常事態に陥ったとき、制御を呼び出し元の上位の処理に返し安全な状態になるよう回復処理をすること。その際に発生した異常のことを例外と呼ぶ。 継続不能や継続すると問題になる様な状態としては、次のようなものが挙げられる。.

新しい!!: スレッドセーフと例外処理 · 続きを見る »

ミューテックス

ミューテックス (Mutex) とは、コンピュータプログラミングにおける技術用語。クリティカルセクションでアトミック性を確保するための排他制御や同期機構の一種である。Mutexという語はMUTual EXclusion (相互排他、排他制御) の省略形である。ここでは、狭義の排他制御について述べる。.

新しい!!: スレッドセーフとミューテックス · 続きを見る »

ポインタ (プログラミング)

ポインタ (pointer) とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)ものである。有名な例としては Pascal のポインタが挙げられる。 なお、C++では、さらに独立した「参照」という機能がある。.

新しい!!: スレッドセーフとポインタ (プログラミング) · 続きを見る »

ライブラリ

ライブラリ()は、汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものである。ライブラリと呼ぶ時は、それ単体ではプログラムとして作動させることはできない実行ファイルではない場合がある。ライブラリは他のプログラムに何らかの機能を提供するコードの集まりと言うことができる。ソースコードの場合と、オブジェクトコード、あるいは専用の形式を用いる場合とがある。たとえば、UNIXのライブラリはオブジェクトコードをarと呼ばれるアーカイバでひとまとめにして利用する。図書館()と同様にプログラム(算譜)の書庫であるので、索引方法が重要である。 また、ソフトウェア以外の再利用可能なものの集合について使われることもある。.

新しい!!: スレッドセーフとライブラリ · 続きを見る »

リエントラント

リエントラント(reentrant、再入可能)とは、プログラムやサブルーチンが実行中に割り込まれ、その実行が完了する前に再び呼び出され実行されても安全だという性質を指す。割り込みは分岐や呼び出しなどの内部的な動きによって生じる場合もあるし、ハードウェア割り込みやシグナルなどの外部の動きによって生じる場合もある。割り込んでの呼び出しが完了すれば、割り込まれた呼び出しが実行を継続できる。 この定義はシングルスレッドのプログラミング環境が起源であり、ハードウェア割り込みで割り込まれた制御の流れが割り込みサービスルーチン (ISR) に転送されることから生まれた。ISRが使用するサブルーチンは割り込みをきっかけとして実行される可能性があるため、リエントラントでなければならない。OSのカーネルが使用するサブルーチンの多くは、カーネルで確保済みのリソースを超えられない制限がありリエントラントではない。そのためISRでできることは限られている。例えば、一般にISRからファイルシステムにはアクセスできないし、場合によってはヒープ領域も確保できない。 直接または間接に再帰可能なサブルーチンはリエントラントである。しかし、グローバル変数が処理の流れの中でしか変化しないことを前提としているサブルーチンはリエントラントではない。グローバル変数を更新するサブルーチンが再帰的に呼び出されれば、1回のサブルーチン実行の中でグローバル変数は突然変化することになる。 リエントラント性の概念はシングルスレッドの環境に起源があり、マルチスレッド環境でのスレッドセーフという概念とは異なる。リエントラントなサブルーチンはスレッドセーフにすることもできるが、リエントラントだというだけであらゆる状況でスレッドセーフと言えるわけではない。逆にスレッドセーフなコードはリエントラントである必要はない(後述の例を参照)。.

新しい!!: スレッドセーフとリエントラント · 続きを見る »

プログラミング (コンピュータ)

ンピュータのプログラミング(programming)とは、コンピュータプログラムを作成することにより、人間の意図した処理を行うようにコンピュータに指示を与える行為である。.

新しい!!: スレッドセーフとプログラミング (コンピュータ) · 続きを見る »

プロセス

プロセスとは、情報処理においてプログラムの動作中のインスタンスを意味し、プログラムのコードおよび全ての変数やその他の状態を含む。オペレーティングシステム (OS) によっては、プロセスが複数のスレッドで構成される場合があり、命令を同時並行して実行する。.

新しい!!: スレッドセーフとプロセス · 続きを見る »

ファイル (コンピュータ)

ンピュータにおけるファイル(file)は、コンピュータでデータを扱いやすくするための仕組み。場合によってはデータセット(data set)とも呼ばれる。.

新しい!!: スレッドセーフとファイル (コンピュータ) · 続きを見る »

アドレス空間

情報処理において、アドレス空間 (Address Space) とは、メモリアドレスが意味を成すコンテキストを定義したもの。あるいは、一連のメモリアドレスによってアクセス可能なメモリ空間を意味する。 メモリアドレスはコンピュータのメモリ内の物理的位置を識別するものであり、住所とある意味で類似している。アドレスはデータが格納されている位置を指すが、それはちょうど人間の住所がその人の居住地を指すのと同じである。人間の住所とのアナロジーで言えば、「アドレス空間」とは、町や市や国といったある範囲の地域に対応すると考えることができる。2つのアドレスが数値的に同じでも、それぞれ異なるアドレス空間内のアドレスであれば、異なる位置を指していると言える。これは2つの市に「××町○丁目△-□」という住所が存在したとき、それらが別の場所を指すのと同じことである。 アドレス空間の例:.

新しい!!: スレッドセーフとアドレス空間 · 続きを見る »

オペレーティングシステム

ペレーティングシステム(Operating System、OS、オーエス)とは、コンピュータのオペレーション(操作・運用・運転)のために、ソフトウェアの中でも基本的、中核的位置づけのシステムソフトウェアである。通常、OSメーカーが組み上げたコンピュータプログラムの集合として、作成され提供されている。 オペレーティングシステムは通常、ユーザーやアプリケーションプログラムとハードウェアの中間に位置し、ユーザーやアプリケーションプログラムに対して標準的なインターフェースを提供すると同時に、ハードウェアなどの各リソースに対して効率的な管理を行う。現代のオペレーティングシステムの主な機能は、ファイルシステムなどの補助記憶装置管理、仮想記憶などのメモリ管理、マルチタスクなどのプロセス管理、更にはGUIなどのユーザインタフェース、TCP/IPなどのネットワーク、などがある。オペレーティングシステムは、パーソナルコンピュータからスーパーコンピュータまでの各種のコンピュータや、更にはスマートフォンやゲーム機などを含む各種の組み込みシステムで、内部的に使用されている。 製品としてのOSには、デスクトップ環境やウィンドウシステムなど、あるいはデータベース管理システム (DBMS) などのミドルウェア、ファイル管理ソフトウェアやエディタや各種設定ツールなどのユーティリティ、基本的なアプリケーションソフトウェア(ウェブブラウザや時計などのアクセサリ)が、マーケティング上の理由などから一緒に含められていることもある。 OSの中で、タスク管理やメモリ管理など特に中核的な機能の部分をカーネル、カーネル以外の部分(シェルなど)をユーザランドと呼ぶ事もある。 現代の主なOSには、Microsoft Windows、Windows Phone、IBM z/OS、Android、macOS(OS X)、iOS、Linux、FreeBSD などがある。.

新しい!!: スレッドセーフとオペレーティングシステム · 続きを見る »

グローバル変数

ーバル変数(大域変数、global variable)は、コンピュータプログラミングにおいて全てのスコープからアクセスできる変数のことである。グローバル変数の寿命は、プログラムの生存期間と同じである。対する語は、ローカル変数である。スコープも参照。.

新しい!!: スレッドセーフとグローバル変数 · 続きを見る »

コールスタック

ールスタック (Call Stack)は、プログラムに実行中にサブルーチンに関する情報を格納するスタックである。実行中のサブルーチンとは、呼び出されたが処理を完了していないサブルーチンを意味する。実行スタック (Execution Stack)、制御スタック (Control Stack)、関数スタック (Function Stack)などとも呼ばれる。また、単に「スタック」と言ったときにコールスタックを指していることが多い。コールスタックを正しく保つことは多くのソフトウェアが正常動作するのに重要であるが、その詳細は高水準言語からは透過的である。.

新しい!!: スレッドセーフとコールスタック · 続きを見る »

シリアライズ

ンピュータプログラミングにおいて、シリアライズ、もしくはシリアル化 (serialize) という用語は、次のような異なる2つの意味を有する。.

新しい!!: スレッドセーフとシリアライズ · 続きを見る »

スレッド (コンピュータ)

レッド(thread)とは、CPU利用の単位。プロセスに比べて、プログラムを実行するときのコンテキスト情報が最小で済むので切り替えが速くなる。スレッドは、thread of execution(実行の脈絡)という言葉を省略したものである。 プログラミングの観点からみると、アプリケーションの処理の「実行の脈絡」は1つでないことが多い。これをシングルスレッドで実現しようとするとシグナルやタイマーを駆使してコーディングすることになる。また、複数のプロセスに分割してプロセス間通信で協調動作させるという方法もある。しかし、いずれの場合もそれらの機能を使うための余分な、本来のアルゴリズムと関係ないコーディングが必要となる。スレッドを使用したプログラミングは本来のアルゴリズムに集中しやすくなり、プログラムの構造が改善されるという効果がある。.

新しい!!: スレッドセーフとスレッド (コンピュータ) · 続きを見る »

スレッド局所記憶

レッド局所記憶(英: Thread local storage, TLS)は、静的もしくは大域的なメモリをスレッドごとに局所的に使用するためのコンピュータプログラミングの方法である。 プロセス内のスレッドはすべてアドレス空間を共有しており、同じプロセスのスレッドから参照する際、静的変数やグローバル変数は同じメモリ番地に配置される。 一方スタック上の変数はすべてのスレッドが自分のスタックを持つためスレッドに対して局所的であり、異なるメモリ番地に存在する。 同じ静的変数・グローバル変数を参照する二つのスレッドが(変数をスレッドに対して局所的にすることで)実際には異なるメモリ番地を参照できることが望ましい場合がある。たとえば典型的な例としてC言語のエラーコードを格納する変数 errno がある。 少なくともメモリアドレスを格納できるサイズの変数をスレッドに対して局所的にすることが可能なら、メモリブロックを確保し、そのメモリアドレスをスレッドローカルな変数に格納すれば、原理的には任意のサイズのメモリブロックをスレッド局所にすることが可能である。.

新しい!!: スレッドセーフとスレッド局所記憶 · 続きを見る »

優先順位の逆転

優先順位の逆転(ゆうせんじゅんいのぎゃくてん、Priority Inversion)とは、スケジューリングにおいて優先順位の高いタスクが必要としているリソースを優先順位の低いタスクが占有しているときに発生する状態である。低い優先順位のタスクがそのリソースを解放するまで高い優先順位のタスクが実行をブロックされるため、実質的に二つのタスクの優先順位が逆転する。他の中程度の優先順位のタスクがその途中で動作するなら、そのタスクは高優先順位のタスクと低優先順位のタスクの両方に優先して動作していることになる。 運が良ければ、優先順位の逆転があっても被害をまぬがれるかもしれない。優先順位の高いタスクの遅延により致命的な何かが起きる前に、運良く、低優先順位のタスクがリソースを解放して、それで間に合うかもしれないからである。しかし一方、優先順位の逆転が深刻な問題の原因となる状況も多々ある。もし高優先順位のタスクがリソーススタベーションの原因となっているのにブロックされているなら、システム全体の誤動作を引き起こすかもしれないし、事前に定義された矯正手段(例えば、ウォッチドッグタイマによるシステム全体のリセット)の引き金となる可能性もある。火星探査船「マーズ・パスファインダー」で発生した問題は、リアルタイムシステムでの優先順位の逆転が引き起こした典型的な例である(#外部リンク参照)。 優先順位の逆転はシステムの見た目の性能も低下させる。低優先順位のタスクは迅速に処理しなくてもよいから低優先順位に設定されている(例えばそれはバッチ処理かもしれないし、他の非対話型処理かもしれない)。同様に、高優先順位のタスクは時間的制限が問題となるから高優先順位に設定される。対話的にユーザーにデータを提供している場合もあるし、何らかのリアルタイムな応答を保証した処理をしているかもしれない。優先順位の逆転は低優先順位のタスクが高優先順位のタスクをブロックしてしまうので、システムの応答性能の低下を招き、保証された応答性能の違反となる可能性もある。 この問題は1970年代から知られているが、この状況を予測する確実な方法はない。様々な解決策は存在している。最も一般的な解決策は次のようなものである。.

新しい!!: スレッドセーフと優先順位の逆転 · 続きを見る »

副作用 (プログラム)

プログラミングにおける副作用(ふくさよう)とは、ある機能がコンピュータの(論理的な)状態を変化させ、それ以降で得られる結果に影響を与えることをいう。代表的な例は変数への値の代入である。 例えば与えられた数字を二倍して返す機能"double"があるとする。 このような機能では次のことが成立する。.

新しい!!: スレッドセーフと副作用 (プログラム) · 続きを見る »

動的メモリ確保

動的メモリ確保 (動的メモリアロケーション・動的メモリ割り当て・dynamic memory allocation) とは、メモリ管理のひとつである、プログラムを実行しながら、並行して必要なメモリ領域の確保と解放を行う仕組みである。 メモリの利用状況は、自身の実行状況や他のプログラムの実行状況に応じて常に変動するため、それらの動作に支障を来さぬよう必要なメモリ領域を適切なアドレスに対して臨機応変に確保・解放を行う必要がある。.

新しい!!: スレッドセーフと動的メモリ確保 · 続きを見る »

C言語

C言語(シーげんご)は、1972年にAT&Tベル研究所のデニス・リッチーが主体となって開発したプログラミング言語である。英語圏では単に C と呼んでおり、日本でも文書や文脈によっては同様に C と呼ぶことがある。.

新しい!!: スレッドセーフとC言語 · 続きを見る »

計算資源

計算資源(けいさんしげん、英語: computational resource)とは、コンピュータ科学などで、計算機(具体的なコンピュータ、そこで動くプロセスやジョブ、あるいは抽象的な計算模型)が「計算量」のために費す、具体的あるいは抽象的な「資源」である。計算機資源と言うこともあるが、その場合はプロセッサ時間や記憶装置などコンピュータのハードウェアの占有量のような具体的なものを指していることが多い。 その他に、アプリケーションプログラムの設定データのような情報をデスクトップ環境などのシステムが保存しているものを「リソース」と呼ぶことがある。詳細は、最後の#その他の節のリンク先を参照のこと。.

新しい!!: スレッドセーフと計算資源 · 続きを見る »

驚き最小の原則

驚き最小の原則(おどろきさいしょうのげんそく、Principle of least astonishment または Rule of least surprise)とは、ユーザインタフェースやプログラミング言語の設計および人間工学において、インタフェースの2つの要素が互いに矛盾あるいは不明瞭だったときに、その動作としては人間のユーザやプログラマが最も自然に思える(驚きが少ない)ものを選択すべきだとする考え方である。 例えば、あるユーザインタフェースでは + を押下することでプログラムを中止させるとする。同じユーザインタフェースにマクロを記録する機能(キーを押下した順序を記録して後で再利用できるようにするもの)があるとする。ユーザは + を含むキーストロークをマクロとして記録したい場合もあるだろう。驚き最小の原則に従えば、マクロ記録中の + はプログラムを中止させずにキーストロークとして記録される方がユーザを驚かせない。 この経験則は、賢明なデフォルトの適用にも関係している。.

新しい!!: スレッドセーフと驚き最小の原則 · 続きを見る »

関数 (数学)

数学における関数(かんすう、、、、、函数とも)とは、かつては、ある変数に依存して決まる値あるいはその対応を表す式の事であった。この言葉はライプニッツによって導入された。その後定義が一般化されて行き、現代的には数の集合に値をとる写像の一種であると理解される。.

新しい!!: スレッドセーフと関数 (数学) · 続きを見る »

HP-UX

HP-UX (Hewlett-Packard UNIX) は、旧ヒューレット・パッカード(HP)社、現ヒューレット・パッカード・エンタープライズ(HPE)社製の UNIX オペレーティングシステムである。ワークステーションおよび中・大規模システム用サーバに採用されている。System V(初期はSystem III)ベースのプロプライエタリUNIXである。.

新しい!!: スレッドセーフとHP-UX · 続きを見る »

排他制御

排他制御せずに ''i'' と ''i+1'' という2つのノードを同時に連結リストから外す操作を行うと、結果として ''i+1'' のノードが外れないという状態になりうる。 排他制御(はいたせいぎょ)とは、コンピュータ・プログラムの実行において、複数のプロセスが利用出来る共有資源に対し、複数のプロセスからの同時アクセスにより競合が発生する場合に、あるプロセスに資源を独占的に利用させている間は、他のプロセスが利用できないようにする事で整合性を保つ処理の事をいう。相互排除または相互排他(mutual exclusion)ともいう。最大k個のプロセスが共有資源にアクセスして良い場合を k-相互排除という。 換言すれば1つのクリティカルセクションに複数のプロセス(またはスレッド)が同時に入ることを防ぐことである。クリティカルセクションとは、プロセスが共有メモリなどの共有資源にアクセスしている期間を指す。排他制御の問題は1965年、エドガー・ダイクストラが Solution of a problem in concurrent programming control(並行プログラミング制御における問題の解法)と題した論文で扱ったのが最初であるTaubenfeld.

新しい!!: スレッドセーフと排他制御 · 続きを見る »

出ていきます入ってきます
ヘイ!私たちは今、Facebook上です! »