独自のワークスティーリング スケジューラを開発した者として、私は次のように言うことができます。
- 独自のスケジューラを作成しないでください (ここではワーク キューがカウントされます)。
- 非効率的に行うか、間違った方法で行うかのどちらかです。
実際、正しいスケジューラーを書くことはそれほど難しくありません。残念ながら、効率的にやろうとすると難しいです。効率的なスケジューラは、ロックの使用を効果的に排除し (おそらく、非常に具体的で明確に指定された状況を除く)、ロックのないクロススレッド通信は苦痛の世界です。
逸話として、私は実際に 1 つのスケジューラーを実装しましたが、そこでは基本的に既存のアルゴリズムをコードにコピーする必要がありましたが、考えられるほぼすべての競合状態をコードに導入することができました。このコードのデバッグは、
- 膨大で複雑なテスト ケースを作成する (実行の 1% 未満でしか発生しない時折の失敗をピックアップするためだけに)、
- コードを見つめるだけで何時間も費やし、ロジックを適用してエラーを把握しようとする
- デバッガーで各行をトレースし (エラーが発生すると、スタック トレースなしでクラッシュします)、すべてのスレッドのすべての変数の状態を手動で追跡して、プログラムの実際の状態が期待される状態と一致していることを確認します。
- コードを数回減らして本質的にゼロにして再構築し、単一行または行のペアをコメントアウトして効果を確認します(巨大な組み合わせスペース)、および
- 壁に向かって走り、頭から先に。