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;
}
線程間同步方式比較: 互斥對象和事件對象屬于核心對象,利用核心對象進行線程同步,速度較慢,但利用互斥對象和事件對象這樣的核心對象,可以在多個程序中的各個線程間進行同步。
關鍵代碼段是工作在使用者方式下,同步速度較快,但在使用關鍵代碼段時,很容易進入死鎖狀态,因為在等待進入關鍵代碼段時無法設定逾時值。