Two-Phase Terminationパターン

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』にある
「Two-Phase Terminationパターン」をC++ Builder 2009で実装してみました。

プログラムの意味は『増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』をご覧下さい。

C++Builder2009には、スレッドを終了するためのTThread.TerminateメソッドとTThread.Terminatedプロパティが用意されています。
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編』のshutdownRequestメソッドは、Terminateメソッドに該当します。

//スレッドセーフな出力
std::unique_ptr<TCriticalSection> CriticalSection(new TCriticalSection);
void Print(const std::string& S)
{
  CriticalSection->Acquire();
  std::cout << S << std::endl;
  CriticalSection->Release();
}

class TCountupThread : public TThread
{
public:
  __fastcall TCountupThread() : TThread(false), FCounter(0) {};
protected:
  //動作
  void __fastcall Execute()
  {
    while (!this->Terminated)
    {
      DoWork();
    }
    DoShutdown();
  }
private:
  long FCounter;
  //作業
  void DoWork()
  {
    FCounter++;
    boost::format fmt("DoWork: counter = %d");
    Print((fmt % FCounter).str());
    Sleep(500);
  }
  //終了処理
  void DoShutdown()
  {
    boost::format fmt("DoShutdown: counter = %d");
    Print((fmt % FCounter).str());
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  Print("main BEGIN");

  //スレッドの起動
  TCountupThread* t = new TCountupThread();

  //少し時間を空ける
  Sleep(10000);

  //スレッドの終了要求
  Print("main shutdownRequest");
  t->Terminate();

  Print("main join");

  //スレッドの終了を待つ
  t->WaitFor();

  Print("main END");

  return 0;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください