Windows執行緒(五)關鍵段無法解決執行緒同步問題
阿新 • • 發佈:2018-12-26
關鍵段:
關鍵段型別CRITICAL_SECTION
1.初始化關鍵段:
void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
2.銷燬關鍵段:
void DeleleCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
3.進入關鍵段:
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
4.離開關鍵段:
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
關鍵段解決執行緒互斥問題測試程式碼如下:
#include <stdio.h>
#include <process.h>
#include <Windows.h>
#define THREAD_NUM 10
CRITICAL_SECTION g_csThreadParameter;
CRITICAL_SECTION g_csThreadCode;
unsigned long g_nNum;
unsigned int __stdcall ThreadFun(void *pM)
{
int nThreadNum = *(int *)pM;
//離開子執行緒的關鍵區域
LeaveCriticalSection(&g_csThreadParameter);
Sleep(50);
//進入子執行緒互斥區域
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep(0);
printf("執行緒編號為%d, 全域性資源值為%d\n", nThreadNum, g_nNum);
//離開各自執行緒互斥區域
LeaveCriticalSection(&g_csThreadCode);
return 0;
}
int main(int argc, char *argv[])
{
HANDLE handle[THREAD_NUM];
int i = 0;
printf("--------------------經典執行緒同步:關鍵段--------------------\n");
//初始化關鍵段
InitializeCriticalSection(&g_csThreadParameter);
InitializeCriticalSection(&g_csThreadCode);
g_nNum = 0;
while(i < THREAD_NUM)
{
//進入子執行緒關鍵段區域
EnterCriticalSection(&g_csThreadParameter);
handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, &i, 0, NULL);
++i;
}
WaitForMultipleObjects(THREAD_NUM, handle, 1, INFINITE);
//刪除關鍵段
DeleteCriticalSection(&g_csThreadCode);
DeleteCriticalSection(&g_csThreadParameter);
system("pause");
return 0;
}
以上程式碼在Visual Studio 2010中的5次執行結果如下:
如上圖所示,該段使用關鍵段的測試程式碼的確解決了執行緒互斥的問題,但是並沒有解決執行緒同步的問題,因此我們需要其他方法,解決執行緒同步問題。