PoEdu培训 Windows班 第三十一课 Windows 线程(十二) 临界区及线程函数中使用静态变量
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第三十一课 Windows 线程(十二) 临界区及线程函数中使用静态变量

文章类别: 培训笔记 0 评论

Windows 线程(十二) 临界区及线程函数中使用静态变量

一个例子

我们首先看这么一段代码

#include <Windows.h>
#include <process.h>

volatile INT g_nNum;
volatile INT g_nLoopCount = 100;
CRITICAL_SECTION g_Cs;  // 临界区/关键段

UINT WINAPI ThreadFunc(LPVOID lParam)
{
    static INT nThreadIndex = 0;
    EnterCriticalSection(&g_Cs);
    ++nThreadIndex;
    g_nNum = 0;
    for (INT i = 0; i < g_nLoopCount; ++i)
    {
        g_nNum += i;
    }
    _tprintf(TEXT("Thread[%d]:[%d]\n"), nThreadIndex, g_nNum);
    LeaveCriticalSection(&g_Cs);
    return 0;
}

int main()
{
    CONST INT MAXTHREADCOUNT = 10;
    HANDLE hThreads[MAXTHREADCOUNT] = { INVALID_HANDLE_VALUE };
    InitializeCriticalSection(&g_Cs);
    for (INT i = 0; i < MAXTHREADCOUNT; ++i)
    {
        hThreads[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, NULL);
    }
    WaitForMutipleObjects(MAXTHREADCOUNT, hThreads, TRUE, INFINITE);
    for (INT i = 0; i < MAXTHREADCOUNT; ++i)
    {
        CloseHandle(hThreads[i]);
    }
    DeleteCriticalSection(&g_Cs);
}

临界区

CRITICAL_SECTION
这个就是临界区, 也称之为关键段

InitializeCriticalSection
初始化临界区

InitializeCriticalSectionAndSpinCount
以旋转锁的方式使用临界区

DeleteCriticalSection
删除临界区

EnterCriticalSection
进入临界区

TryEnterCriticalSection
尝试进入临界区

LeaveCriticalSection
离开临界区

线程中使用静态变量

例子中我们可以看到, 为了标识线程, 使用了一个 static 的变量

未完待续...

如有错误,请提出指正!谢谢.

回复