---
title: "再入可能とは？再帰的・再使用可能・再配置可能との違い【基本情報技術者試験】"
description: "再入可能（リエントラント）を、実行中でも別の処理から再度呼び出されて正しく動作できる性質として整理し、再帰的・再使用可能・再配置可能との違いをFE科目A向けに解説します。"
last_modified_at: "2026-08-14"
canonical_url: "https://stemtazoo.github.io/fe/reentrant-program/"
section: "fe"
---

## まず結論

再入可能とは、**あるプログラムが実行中でも、別の処理から再度呼び出されて正しく動作できる性質**です。

再入可能は、英語では **reentrant（リエントラント）** と呼ばれます。

基本情報技術者試験では、次のように切り分けると判断しやすくなります。

```text
自分自身を呼び出す
→ 再帰的

実行終了後に再び使える
→ 再使用可能

実行中でも別の処理から呼び出せる
→ 再入可能

メモリ上のどこに置いても実行できる
→ 再配置可能
```

特に、

```text
まだ処理が終わっていない
＋
別の処理から再度呼び出される
→ 再入可能
```

が重要です。

## 直感的な説明

再入可能は、**同じ仕事をしている途中でも、別の依頼を受けて安全に処理できる**イメージです。

例えば、ある関数が処理中だとします。

```text
タスクA
↓
関数Xを実行中
```

その途中で別のタスクBも同じ関数Xを呼び出します。

```text
タスクA → 関数X
タスクB → 関数X
```

このとき、それぞれの処理が混ざらず、正しい結果を返せるなら、その関数は再入可能です。

つまり、

```text
同じプログラムを
同時に使っても壊れない
→ 再入可能
```

と考えると分かりやすいです。

## 定義・仕組み

再入可能なプログラムは、複数の処理から同時または重なって呼び出されても、互いの処理を壊さずに動作できます。

### なぜ再入可能である必要があるのか

マルチタスク環境では、同じ関数や処理が複数のタスクから呼ばれることがあります。

例えば、

```text
タスクA
→ 共通処理Xを呼ぶ

タスクB
→ 共通処理Xを呼ぶ
```

という状況です。

ここで、共通処理Xが内部の共有データを無秩序に書き換えると、結果が壊れることがあります。

そのため、再入可能な処理では、

- 呼出しごとのデータを分ける
- 共有データを書き換えない
- 必要に応じて排他制御する

などの工夫が必要です。

### ローカルな状態を使う

再入可能性を高める代表的な考え方は、呼出しごとの状態を分けることです。

```text
呼出しAの変数
→ A専用

呼出しBの変数
→ B専用
```

このようにすれば、同じ関数が同時に呼ばれても、互いの処理結果が混ざりにくくなります。

### 共有データには注意する

一方で、

```text
全呼出しで共有する変数
```

を勝手に書き換えると、再入可能性が失われることがあります。

```text
呼出しAが共有変数を書換え
↓
その途中で呼出しBも書換え
↓
値が壊れる
```

という問題が起こるためです。

## 科目Aでどう出る？

科目Aでは、再入可能・再帰的・再使用可能・再配置可能の意味を切り分ける問題が出ます。

### 判断表

| 用語 | 意味 | 判断キーワード |
|---|---|---|
| 再帰的 | 自分自身を呼び出す | 自己呼出し |
| 再使用可能 | 実行終了後に再ロードせず再利用できる | 再ロード不要 |
| 再入可能 | 実行中でも別の処理から再度呼び出せる | 同時呼出し |
| 再配置可能 | メモリ上の配置場所が変わっても実行できる | 配置場所に依存しない |

### 試験中の切り分け

```text
自分を呼ぶ？
→ 再帰的

処理が終わったあと再利用？
→ 再使用可能

まだ実行中なのに別の処理から呼ばれる？
→ 再入可能

メモリの場所を変えても動く？
→ 再配置可能
```

この4つは、名前が似ているので「何が再び起きるのか」を見ると判断しやすくなります。

## どんな場面で使う？

再入可能性は、同じ処理が複数のタスクやスレッドから使われる可能性がある場面で重要です。

例えば、

- OSの共通処理
- ライブラリ関数
- マルチスレッドプログラム
- サーバプログラム
- 割込み処理で呼ばれる関数

などです。

### マルチタスク環境

複数のタスクが同じ共通処理を使う場合、

```text
タスクA
タスクB
タスクC
↓
同じ関数を呼ぶ
```

ことがあります。

このような環境では、処理が重なっても正しく動くことが重要になります。

## よくある誤解・混同

### 再入可能と再帰的は同じ？

違います。

```text
自分自身を呼び出す
→ 再帰的

別の処理から実行中に再度呼ばれる
→ 再入可能
```

「再び呼ばれる」という点は似ていますが、呼び出す相手が違います。

### 再入可能と再使用可能は同じ？

違います。

```text
処理終了後にもう一度使う
→ 再使用可能

まだ処理中なのに、別の処理から同時に使う
→ 再入可能
```

試験では、

```text
終了していない
```

という表現が出たら、再入可能を疑います。

### 再配置可能とは？

再配置可能は、プログラムをメモリ上のどこに配置しても実行できる性質です。

```text
アドレス1000から実行
↓
正しく動く

アドレス5000から実行
↓
正しく動く
```

このように、配置場所に依存しないことがポイントです。

### 再入可能なら必ずスレッドセーフ？

完全に同じ意味ではありません。

再入可能は、実行中に再度呼び出されても正しく動ける性質です。

一方、スレッドセーフは、複数スレッドから同時に利用しても正しく動作することを広く表す言葉です。

FEでは、まず

```text
実行中に再度呼び出されても正しく動く
→ 再入可能
```

と整理できれば十分です。

## 確認問題（基本情報技術者試験対策）

あるプログラムAの処理が終了していないときに、別のプログラムから再度呼び出されても正しく動作する。このプログラムAの性質として、最も適切なものはどれか。

- ア. 再帰的
- イ. 再使用可能
- ウ. 再入可能
- エ. 再配置可能

<details markdown="1">
<summary>▶ クリックして答えと解説を見る（ここを開く）</summary>

**正解：ウ**

再入可能とは、プログラムが実行中でも、別の処理から再度呼び出されて正しく動作できる性質です。

- 再帰的：自分自身を呼び出す
- 再使用可能：実行終了後に再ロードせず再び使用できる
- 再配置可能：メモリ上のどこに配置しても実行できる

</details>

## まとめ（試験直前用）

- 再入可能は、実行中でも別の処理から再度呼び出せる性質
- **「まだ処理が終わっていないのに再度呼ばれる」→ 再入可能**
- 自分自身を呼ぶのは再帰的
- 実行終了後に再利用できるのは再使用可能
- 配置場所を変えても動くのは再配置可能
- 再入可能な処理では、呼出しごとの状態を分けることが重要
