マルチスレッドのそれくらいのこと(C++ロック)
【声明:著作権所有、転載歓迎、商業用途に使用しないでください.連絡ポスト:[email protected]】
プログラムの作成は容易ではありません.マルチスレッドのプログラムの作成は容易ではありません.マルチスレッドを記述しすぎるプログラムには、このような苦痛な過程があると信じています.どのような状況ですか.友達はコードを見て分かるはずですが、
では、C++の特性を利用して、このような状況を自動的に処理する可能性はありますか?本当にありますね.次のコードを見てみましょう
実は、これがc++のtrickです.
プログラムの作成は容易ではありません.マルチスレッドのプログラムの作成は容易ではありません.マルチスレッドを記述しすぎるプログラムには、このような苦痛な過程があると信じています.どのような状況ですか.友達はコードを見て分かるはずですが、
void data_process()
{
EnterCriticalSection();
if(/* error happens */)
{
LeaveCriticalSection();
return;
}
if(/* other error happens */)
{
return;
}
LeaveCriticalSection();
}
上のコードは、1つの状況を説明している.このようなマルチスレッドの反発は,コード作成中によく遭遇する.したがって,共有データを操作するたびにEnterCriticalSectionとLeaveCriticalSectionの操作が必要となる.しかし、その間も順風満帆ではなかった.いろいろな間違いに遭遇する可能性があります.では、この時あなたのプログラムは飛び出しなければなりません.最初にerrorに出会ったとき、臨界領域を脱退する必要があることを覚えています.しかし、間違いが多くなったら、この操作があるとは限らない.この間違いは終わり、他のスレッドはこのロックを取得する機会がありません.では、C++の特性を利用して、このような状況を自動的に処理する可能性はありますか?本当にありますね.次のコードを見てみましょう
class CLock
{
CRITICAL_SECTION& cs;
public:
CLock(CRITICAL_SECTION& lock):cs(lock){
EnterCriticalSection(&cs);
}
~CLock() {
LeaveCriticalSection(&cs);
}
}
class Process
{
CRITICAL_SECTION cs;
/* other data */
public:
Process(){
InitializeCriticalSection(&cs);
}
~Process() {DeleteCriticalSection(&cs);}
void data_process(){
CLock lock(cs);
if(/* error happens */){
return;
}
return;
}
}
C++の重要な特徴は、関数がいつ終了しても、クラスの構造関数が自動的に呼び出されることです.プロセスクラスでのdata_プロセス関数では、関数は最初からCLockクラスを作成します.では,このクラスを作成すると,実は臨界領域のpkが開始される.では、いったん臨界領域に入ると、errorの中で直ちに臨界領域を脱退することができますか?このとき,c++解析関数の利点が現れた.エラーがいつ発生しても、関数が終了する前に、システムが後始末をしてくれるからです.何の善後ですか.つまり、CLockの構造関数、すなわち臨界領域を終了するシステムが呼び出されます.これで、私たちの目的は達成されました.実は、これがc++のtrickです.