マルチスレッドのそれくらいのこと(C++ロック)


【声明:著作権所有、転載歓迎、商業用途に使用しないでください.連絡ポスト:[email protected]
  
プログラムの作成は容易ではありません.マルチスレッドのプログラムの作成は容易ではありません.マルチスレッドを記述しすぎるプログラムには、このような苦痛な過程があると信じています.どのような状況ですか.友達はコードを見て分かるはずですが、
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です.