『増補改訂版 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;
}