解答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の並行処理は、低レベルながら安全で効率的なプログラミングを可能にします。