<10> ファイバー (Delphi コンカレントプログラミング)

# 10. ファイバー
**ファイバー** (Fiber) は軽量スレッド (Lightweight Thread) や、マイクロスレッド (Micro Thread) とも呼ばれます。端的に言えば、並行動作しない疑似的なスレッドです。

ファイバーは実質的に **コルーチン** と同じで、Pascal の後継言語である Modula-2 にはコルーチンが実装されています。Pascal の方言にもコルーチンが実装されたものがあったようです。

サブルーチンは常に先頭からしか実行できませんが、コルーチンは中断したり中断した所から再開する事ができます。

 - [ファイバー (コンピュータ) (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%83%BC_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))
 - [コルーチン (Wikipedia)](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3)
 - [割と簡単に ’標準 Modula-2 / Oberon-2' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/8e8be01f749915167a91)
 - [COMTAY coroutine manager (OpenSIMPLY)](https://opensimply.org/comtay.php/)
 - [Example - COMTAY coroutine manager (OpenSIMPLY)](https://opensimply.org/comtay-example-pascal.php)


## 10.1. Delphi とファイバー
Delphi には標準のファイバー (やコルーチン) は実装されていません。

Windows にはファイバー API が存在するので、Windows アプリケーションの場合にはこれを使う事になります。ファイバー API は `Winapi.Windows` 名前空間で定義されています。

| Windows API | 説明 |
|:---|:---|
| [CreateFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-createfiber) | ファイバー オブジェクトを割り当て、スタックを割り当て、指定した開始アドレス (通常はファイバー関数) で開始するように実行を設定します。 |
| [CreateFiberEx()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-createfiberex)  | ファイバー オブジェクトを割り当て、スタックを割り当て、指定した開始アドレス (通常はファイバー関数) で開始するように実行を設定します。 |
| [SwitchToFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-switchtofiber)  | ファイバーをスケジュールします。  |
| [ConvertFiberToThread()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-convertfibertothread)  | 現在のファイバーをスレッドに変換します。  |
| [ConvertThreadToFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-convertthreadtofiber)  | 現在のスレッドをファイバーに変換します。<br>※12 Athens よりも前の Delphi では定義が間違っています。  |
| [ConvertThreadToFiberEx()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-convertthreadtofiberex)  | 現在のスレッドをファイバーに変換します。  |
| [DeleteFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-deletefiber)  | 既存のファイバーを削除します。  |
| [IsThreadAFiber()](https://learn.microsoft.com/ja-jp/windows/win32/api/fibersapi/nf-fibersapi-isthreadafiber)  | 現在のスレッドがファイバーであるかどうかを判断します。 |

ファイバー API はかなり古くからある API で、Windows NT 3.51 SP3 で実装されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b64be1bb-2d0f-4670-86b9-e300a2ce32d1.png)

画像は Nifty-Serve の FDELPHI に投稿されたファイバー API の使用例を実行してみたところです。2つの PaintBox を同時にグラデーション描画します。

**See also:**

 - [ファイバー (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/procthread/fibers)
 - [ファイバーの使用 (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/procthread/using-fibers)
  - [Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API (learn.microsoft.com)](https://learn.microsoft.com/en-us/archive/msdn-magazine/2003/september/implement-coroutines-for-net-by-wrapping-the-unmanaged-fiber-api)
 - ["Fiber（ファイバ）" - FDELPHI (DelFusa Floor)](http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/01186.html)
 - [Coroutine - ObjectPascal Magic Programming (いつも心に工事中！)](https://hp.vector.co.jp/authors/VA028375/delphi/delphipascal_xx_coroutine.html)
 - [The ConvertThreadToFiber() API is incorrectly defined (Quality Portal)](https://quality.embarcadero.com/browse/RSP-40148)

## 10.2. Windows のユーザーモードスケジューラ (UMS)

Windows 7 で実装された **ユーザーモードスケジューラ (UMS)** は端的に言えば「ファイバーのような機構を提供するもの」です。

 - 64bit カーネル 専用。
 - Windows 10 が Anniversary Update 以降の場合、Ivy Bridge よりも前の CPU では動作しない。
 - (2022/12 現在) Windows 11 では動作しない。

うーん。

**See also:**

 - [ユーザーモードスケジューリング (learn.microsoft.com)](https://learn.microsoft.com/ja-jp/windows/win32/procthread/user-mode-scheduling)
 - [Inside Windows 7: Dave Probert - User Mode Scheduler (UMS) (Youtube)](https://www.youtube.com/watch?v=PYlP8MXRCZc)
 - [Bringing Call Gates Back (ALEX IONESCU’S BLOG)](http://www.alex-ionescu.com/?p=340)

# 索引
[ [← 9. 非同期プログラミングライブラリ (APL)](https://qiita.com/ht_deko/items/eedf3728be2a301a8a5d) ] [ [↑ 目次へ](https://qiita.com/items/e8c1ff3a4c74e4c2a4f3) ] [ [→ 付録](https://qiita.com/ht_deko/items/2f8d55f69d30ba622d3b) ]