2009年3月12日木曜日

マルチスレッドについて(4)

 マルチスレッドでリソースを共有するには同期保護が必要なので、逆の考え方をすれば、いかにリソースを共有しないで分離して並列に処理ができるか?という事に重点を置いた方が良さそうです。これが最初にあげた分離化です。これからは、なるべくリソースを共有しないでも解けるアルゴリズムが重要になると思います。
 最初にあげた整合性確保ですが、大域的な視点で並列化というものを考えましょうという意味で、あえて同期保護とは別にしました。なっていない例で私が思いつくのは、Visual C++ のコンパイルです。プロジェクトの依存関係を設定しているにもかかわらず、それを全く無視して並列にコンパイルしやがるからです。CというプロジェクトはBというプロジェクトに依存しているのに、BとCを平気で同時にコンパイルします。何も考えてないだろ!と、突っ込みを入れて笑うしかありません。
 サイト間で連帯するために、ログを直列化して送信するとしましょう。サイトAからサイトBにログを直列化して送信している所へ別のトリガにより同時に並列でサイトAからサイトBにログを直列化して送信しようとすると、おかしな事になります。前者を処理1、後者を処理2として、以下のケースを考えます。

処理1:  サイトAは、サイトBから受信済みのログ番号Nを取得する
処理1: サイトAは、サイトBにログ番号N+1、N+2、N+3と送信する
処理2: サイトAは、サイトBから受信済みログ番号N+3を取得する
処理2: サイトAは、サイトBにログ番号N+4、N+5、N+6を送信する
処理1: サイトAは、サイトBにログ番号N+4,N+5、N+6を送信する

このケースでは、直列化していなければならないログが、重複した上にシャッフルされてしまいます。サイトAの送信処理は、同じサイトへの同時送信は避けて、再スケジュールするといった措置が必要です。
・・・続く

0 件のコメント: