1. 程式人生 > >Windows執行緒(五)關鍵段無法解決執行緒同步問題

Windows執行緒(五)關鍵段無法解決執行緒同步問題

關鍵段:


關鍵段型別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次執行結果如下:


這裡寫圖片描述


這裡寫圖片描述


這裡寫圖片描述


這裡寫圖片描述


這裡寫圖片描述


如上圖所示,該段使用關鍵段的測試程式碼的確解決了執行緒互斥的問題,但是並沒有解決執行緒同步的問題,因此我們需要其他方法,解決執行緒同步問題。