C++多线程 之 临界区

临界区:

通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

临界区包含两个操作原语: 

EnterCriticalSection() 进入临界区 

LeaveCriticalSection() 离开临界区 

EnterCriticalSection() 语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的 LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本 进程内的线程,而不可用来同步多个进程中的线程。



#include <windows.h>

#include <stdlib.h>

#include <iostream>

#include <tchar.h>

#include <process.h>

using namespace std;

HANDLE hStdOut;

CONSOLE_SCREEN_BUFFER_INFO csbi;

bool bRepeat= true;

void CharThread(void *posCh);

void NumThread(void *posNum);

void KillThread(void *dummy);

int main ()

{

    COORD posch;

    COORD posNum;

    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hStdOut, &csbi);

    posch.X = 0;

    posch.Y = 0;

    if (-1 == _beginthread(CharThread, 0, (void*)&posch))

    {

        printf("Create char Thread failed\n");

        return 1;

    }

    posNum.X = 25;

    posNum.Y = 0;

    if (-1 == _beginthread(NumThread, 0, (void*)&posNum))

    {

        printf("Create Num threa failed\n");

        return 1;

    }

    while (bRepeat)

    {

        Sleep(15000);

        if (-1 == _beginthread(KillThread, 0, NULL))

        {

            printf("Create KILL thread failed\n");

            return 1;

        }

    }

    return 0;

}

void CharThread(void *posCh)

{    

    COORD newPos;

    DWORD dwResult;

    TCHAR * pChA = _T("Hello\0");

    TCHAR *pChB = _T("       ");

    int i = 0;

    bool bUp = true;

    while (bRepeat)

    {

        newPos.X = ((COORD*)posCh)->X+i;

        newPos.Y= ((COORD*)posCh)->Y+ i;

        WriteConsoleOutputCharacter(hStdOut, pChA, 12, newPos,&dwResult);

        Sleep(100);

        WriteConsoleOutputCharacter(hStdOut, pChB, 12, newPos, &dwResult);

        if (bUp)

        {

            i++;

            if (25==i)

            {

                bUp = false;

            }

        }

        else

        {

            i–;

            if (0 == i)

                bUp = true;

        }

    }

}

void NumThread(void *posNum)

{

    COORD newPos;

    DWORD dwResult;

    TCHAR *pChA = _T("shensong");

    TCHAR*pChB = _T("                       ");

    int i = 0;

    bool bup = true;

    while (bRepeat)

    {

        newPos.X = ((COORD*)posNum)->X  i;

        newPos.Y = ((COORD*)posNum)->Y + i;

        WriteConsoleOutputCharacter(hStdOut, pChA, 24, newPos, &dwResult);

        Sleep(100);

        WriteConsoleOutputCharacter(hStdOut, pChB, 24, newPos, &dwResult);

        if (bup)

        {

            i++;

            if (25==i)

            {

                bup = false;

            }

        }

        else

        {

            i–;

            if (0==i)

            {

                bup = true;

            }

        }

    }

}

void KillThread(void *dummy)

{

    bRepeat = false;

    TCHAR*pCh = _T("KILL Thread");

    COORD pos;

    pos.X = 10;

    pos.Y = 10;

    DWORD dwResult;

    WriteConsoleOutputCharacter(hStdOut, pCh, 13, pos, &dwResult);

    Sleep(150000);

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注