解答16: 非同期と並行処理

概要

Zigのマルチスレッド機能を活用して、並行処理、同期、Producer-Consumerパターン、スレッドプールの実装について学びます。

解答のポイント

1. std.Thread

  • spawn()でスレッド生成
  • join()で完了待機
  • 関数とパラメータの渡し方

2. 同期プリミティブ

  • Mutex: 排他制御
  • RwLock: 読み書きロック
  • Condition: 条件変数
  • atomic.Value: アトミック操作

3. Producer-Consumer

  • BoundedQueue の実装
  • 条件変数による待機
  • シャットダウン処理

4. スレッドプール

  • ワーカースレッドの管理
  • タスクキューの実装
  • グレースフルシャットダウン

よくある間違い

データ競合

// 間違い
var counter: i32 = 0;
// 複数スレッドから直接アクセス

// 正しい
var counter: i32 = 0;
var mutex = std.Thread.Mutex{};
mutex.lock();
defer mutex.unlock();
counter += 1;

デッドロック

// 間違い
mutex1.lock();
mutex2.lock();  // 別スレッドで逆順でロック→デッドロック

// 正しい
// 常に同じ順序でロックを取得

発展課題

  • 並列マージソート
  • ワークスティーリングキュー
  • アクターモデルの実装
  • 非同期I/O
  • スレッドプールのベンチマーク

まとめ

Zigの並行処理は、低レベルながら安全で効率的なプログラミングを可能にします。