_beginthreadex()および非同期スレッドの同期の問題

免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/qq_33810188/article/details/91816237

CRTは非常に良いマルチスレッド機能_beginthreadex()、あなたはこの機能によって運営同期および非同期のプログラムを設計することができますがあります。次のように、誰か他の人のプログラムの変更後、あなたは同期および非同期スレッドの問題のより深い理解することができます!

---------------

書式#include <iostreamの>
の#include <windows.hに>
する#include <process.h>

CRITICAL_SECTIONのg_cs; //クリティカルセクションロック

構造体のtypedef _STRUCT_DATA_
{
    int型のID; //チケットIDを識別するための
    int型のチケットを、

} _DATA、* _pDATA。

符号なし__stdcallのFun1Proc(LPVOID lpParam)。
符号なし__stdcallのFun2Proc(LPVOID lpParam)。


INTメイン()
{
    HANDLE hThread [2] = {NULL、NULL}。
    符号なしのスレッドID [2] = {0}。

    _DATAのstru_data。
    stru_data.id = 0;
    stru_data.tickets = 1000;

    InitializeCriticalSection(&g_cs);
    hThread [0] =(HANDLE)_beginthreadex(NULL、0、Fun1Proc、&stru_data、0、&のThreadID [0]); //子スレッド1
    hThreadの[1] =(HANDLE)_beginthreadex(NULL、0、 Fun2Proc、&stru_data、0、&スレッドID [1]); // 子スレッド2
    スリープ(100);いくつかの時間、それを実行している//子スレッド

1つの#if
    それは非同期アーキテクチャであるため、/ *、メインスレッドは実行を続け!* /

    実行が完了していない場合(TRUE)しながら、//非同期の問題のために、GetExitCodeThreadを通じて健康糸を得るために、遅延がそうでない場合、メインスレッドが待ち続け、子スレッドの実行が完了していることができます!
    {
        DWORD dwExitCode1、dwExitCode2;
        GetExitCodeThread(hThread [0]、&dwExitCode1); //実行が戻りdwExitCode = 0を終了した場合、スレッドは、さもなければ259、実行が終了され得る
        GetExitCodeThread(hThread [1]、&dwExitCode2);
        IF(dwExitCode1 =! !0 || dwExitCode2 = 0)//一方は100ミリ秒待機し、実行が終了していない
        {
            スリープ(100);
        }
        他
        {
            BREAK;
        }
    }
whileループスルー#endifの//は、メインスレッドとサブスレッドの同期に達することができます!
    LeaveCriticalSection(&g_cs)。

    std :: cin.get();
    0を返します。
}

符号なし__stdcallのFun1Proc(LPVOID lpParam)
{
    _pDATAデータ=(_pDATA)lpParam。

    (TRUE)、一方
    {
        EnterCriticalSection(&g_cs)。

        IF(DATA->チケット> 0)
        {
            スリープ(1);
            STD :: COUT << "ID:" << DATA-> ID :: STD ++ << ENDL;
            STD :: COUT << "売りスレッド1のチケット:" DATA- <<> :: STD tickets-- << ENDL;
            LeaveCriticalSection(&g_cs);
        }
        他
        {
            LeaveCriticalSection(&g_cs);
            BREAK;
        }
        //スリープ(1); //時間遅延、共有データのためのテストを追加訪問
    }

    0を返します。
}

符号なし__stdcallのFun2Proc(LPVOID lpParam)
{
    _pDATAデータ=(_pDATA)lpParam。

    (TRUE)、一方
    {
        EnterCriticalSection(&g_cs)。

        IF(DATA->チケット> 0)
        {
            スリープ(1)。
            std :: coutの<< "ID:" <<データ- >のid ++ <<はstd ::てendl;
            std :: coutの<< "チケット販売スレッド2:" <<はstd :: ENDL tickets-- <<データ- >を。
            LeaveCriticalSection(&g_cs)。
        }
        他
        {
            LeaveCriticalSection(&g_cs)。
            ブレーク;
        }

    }
    0を返します。
}

---------------

最後のメインスレッドの実行が終了した後に上記、の#if 0 ... #endifのことで、非同期設計プログラムは、非同期状態で見つけることができ、メインスレッドは関係なく、子スレッドの状態の実行され、メインスレッドはその後、リード、子供を実行しますスレッドには、実行が終了していません!図示のように:

あなたは子スレッドが子スレッドの実行が完了していない場合には、一定の時間を待つために、メインスレッドの実行が完了していないかどうかを監視するスレッドを実行する#endifの#ifの1 ...でペアにすることができ、よりので、いくつかの時間を待ち続けメインスレッドのコードと副同期制御スレッド、他のスレッドでは、もちろん、機能を遮断する目的の角度は、スレッドは特殊糸のブロッキングおよび分離機能を有しています。図示のように:

これは、プログラム内でクリティカルセクションを追加すると、各スレッドのデータをチャネリング公開データにアクセスするときはもちろんのミューテックス機能のデータのセキュリティを確保するために重要なエリアを連動の目的を達成することはありませんが、また同じことを達成できるようにすることです、注意すべきです目的。

 

おすすめ

転載: blog.csdn.net/qq_33810188/article/details/91816237