並列プログラミングの落とし穴⑤スタベーション

スタベーション(starvation)とは「飢餓」という意味です。

複数のタスクが同時実行しているとき、あるタスクがスケジューリングされない、あるいはリソースにアクセスできない時間が長期に続くことです。結果的にそのタスクは飢餓状態になります。

並列プログラミングにおけるスタベーションの例としてよく出てくるのが、ダイクストラが提示した「食事する哲学者の問題」です。この問題は、5人の哲学者が円卓に座って「食事」(スパゲティ)と「思索」を続けるとき、食事には間にあるフォーク(「箸」と書いてあることもある)が2本必要という制約の下で、デッドロックもスタベーションも起こさないようにするにはどうすればよいかという問題です。もともと「飢餓」という言葉もこの「食事」から来ているようです。

デッドロックに比べスタベーションはあまり発生しないので、開発時に問題を発見するのが難しいです。

並列プログラム サンプル for .NET 4」と「並行ランタイム&PPL サンプル for Win32」に「食事する哲学者」のサンプルコード(DiningPhilosophers)があるので参照してください。また、MSDN Magazine June 2009でも VS2010 の C++ Asynchronous Agents Libraryによる解決方法が解説されています。