天天看點

Windows 臨界區,核心事件,互斥量,信号量 Windows 臨界區,核心事件,互斥量,信号量。

Windows 臨界區,核心事件,互斥量,信号量。

臨界區,核心事件,互斥量,信号量,都能完成線程的同步,在這裡把他們各自的函數調用,結構定義,以及适用情況做一個總結。

臨界區: 适用範圍:它隻能同步一個程序中的線程,不能跨程序同步。一般用它來做單個程序内的代碼快同步,效率比較高。 相關結構:CRITICAL_SECTION  _critical 相關方法: InitializeCriticalSection(& _critical) 

DeleteCriticalSection(& _critical) 

EnterCriticalSection(& _critical)

LeaveCriticalSection(& _critical)

代碼Demo #include "stdafx.h"

int thread_count = 0;

CRITICAL_SECTION g_cs;

DWORD CALLBACK thread_proc(LPVOID params)

{

    for(int i = 0; i < 10; ++i)

    {

            //synchronized(mutex1)

            EnterCriticalSection(&g_cs);

            {

                for(char c = 'A'; c <= 'Z'; ++c)

                {

                    printf("%c",c);

                }

                printf("\n");

            }

            LeaveCriticalSection(&g_cs);

    }

    thread_count--;

    return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

    InitializeCriticalSection(&g_cs);

    thread_count = 4;

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    while (thread_count) 

        Sleep(0);

    getchar();

    DeleteCriticalSection(&g_cs);

    return 0;

核心事件: 适用範圍:多用于線程間的通信,可以跨程序同步。 相關結構: HANDLE hEvent; 相關方法: hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

WatiForSingleObject(hEvent,INIFINET)

SetEvent(hEvent);

ResetEvent(hEvent)

WaitForMultiObjects(DWORD nCount, // 等待句柄數  CONST HANDLE *lpHandles, // 句柄數組首位址 BOOL fWaitAll, // 等待标志

 DWORD dwMilliseconds // 等待時間間隔)

HANDLE OpenEvent(

DWORD dwDesiredAccess, // 通路标志

BOOL bInheritHandle, // 繼承标志

LPCTSTR lpName // 指向事件對象名的指針

); 測試代碼 #include "stdafx.h"

int thread_count = 0;

HANDLE hEvent;

DWORD CALLBACK thread_proc(LPVOID params)

{

    for(int i = 0; i < 10; ++i)

    {

            //synchronized(mutex1)

            //EnterCriticalSection(&g_cs);

            WaitForSingleObject(hEvent,INFINITE);

            {    

                for(char c = 'A'; c <= 'Z'; ++c)

                {

                    printf("%c",c);

                    Sleep(1);

                }

                printf("\n");

            }

            SetEvent(hEvent);

            //LeaveCriticalSection(&g_cs);

    }

    thread_count--;

    return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

    //InitializeCriticalSection(&g_cs);

    hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

    SetEvent(hEvent);

    thread_count = 4;

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    while (thread_count) 

        Sleep(0);

    getchar();

    //DeleteCriticalSection(&g_cs);

    return 0;

}

互斥量: 适用範圍:可以跨程序同步,還可以用來保證程式隻有一個執行個體運作(建立命名互斥量),也可以用來做線程間的同步 相關結構:HANDLE hMutex; 相關方法: CreateMutex(NULL,FALSE,NULL)

WaitForSingleObject(hMutex,INIFINET);//同僚件對象

ReleaseMutex(hMutex)

WaitForMultiObjects(DWORD nCount, // 等待句柄數  CONST HANDLE *lpHandles, // 句柄數組首位址 BOOL fWaitAll, // 等待标志

 DWORD dwMilliseconds // 等待時間間隔)

HANDLE OpenMutex(

DWORD dwDesiredAccess, // 通路标志

BOOL bInheritHandle, // 繼承标志

LPCTSTR lpName // 互斥對象名

);

測試demo #include "stdafx.h"

int thread_count = 0;

//HANDLE hEvent;

HANDLE hMutex;

DWORD CALLBACK thread_proc(LPVOID params)

{

    for(int i = 0; i < 10; ++i)

    {

            //synchronized(mutex1)

            //EnterCriticalSection(&g_cs);

            WaitForSingleObject(hMutex,INFINITE);

            //WaitForSingleObject(hEvent,INFINITE);

            //{    

                for(char c = 'A'; c <= 'Z'; ++c)

                {

                    printf("%c",c);

                    Sleep(1);

                }

                printf("\n");

            //}

            //SetEvent(hEvent);

            ReleaseMutex(hMutex);

            //LeaveCriticalSection(&g_cs);

    }

    thread_count--;

    return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

    //InitializeCriticalSection(&g_cs);

    //hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);

    //SetEvent(hEvent);

    hMutex = CreateMutex(NULL,FALSE,NULL);

    thread_count = 4;

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    CreateThread(0, 0, thread_proc, 0, 0, 0);

    while (thread_count) 

        Sleep(0);

    getchar();

    //DeleteCriticalSection(&g_cs);

    return 0;

}

線程間同步方式比較:      互斥對象和事件對象屬于核心對象,利用核心對象進行線程同步,速度較慢,但利用互斥對象和事件對象這樣的核心對象,可以在多個程序中的各個線程間進行同步。

     關鍵代碼段是工作在使用者方式下,同步速度較快,但在使用關鍵代碼段時,很容易進入死鎖狀态,因為在等待進入關鍵代碼段時無法設定逾時值。

繼續閱讀