【多线程】(四)关键段CS

来源:互联网 发布:淘宝刷单负债百万 编辑:程序博客网 时间:2024/05/17 05:08

参照 http://blog.csdn.net/morewindows/article/details/7442639

 

关键段CRITICAL_SECTION一共就四个函数,使用很是方便。下面是这四个函数的原型和使用说明。

 

函数功能:初始化

函数原型:

voidInitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

函数说明:定义关键段变量后必须先初始化。

 

函数功能:销毁

函数原型:

voidDeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

函数说明:用完之后记得销毁。

 

函数功能:进入关键区域

函数原型:

voidEnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

函数说明:系统保证各线程互斥的进入关键区域。

 

函数功能:离开关关键区域

函数原型:

voidLeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

 

然后在经典多线程问题中设置二个关键区域。一个是主线程在递增子线程序号时,另一个是各子线程互斥的访问输出全局资源时。

// Thread003.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "process.h"#include "windows.h"long g_nNum ;const int THREAD_NUM = 10;CRITICAL_SECTION g_csThreadPara,g_csThreadCode;unsigned int __stdcall Fun(void *pPM){int nThreadNum = *(int *)pPM;LeaveCriticalSection(&g_csThreadPara);Sleep(50);EnterCriticalSection(&g_csThreadCode);g_nNum++;Sleep(0);printf("线程编号为%d  全局资源值为%d\n",nThreadNum,g_nNum);LeaveCriticalSection(&g_csThreadCode);return 0;}int _tmain(int argc, _TCHAR* argv[]){//关键段初始化InitializeCriticalSection(&g_csThreadCode);InitializeCriticalSection(&g_csThreadPara);g_nNum = 0;HANDLE handle[THREAD_NUM];int i = 0;while (i<THREAD_NUM){EnterCriticalSection(&g_csThreadPara);//进入子线程序号关键区域handle[i]=(HANDLE)_beginthreadex(NULL, 0, Fun ,&i ,0, NULL);i++;}WaitForMultipleObjects(THREAD_NUM ,handle,TRUE ,INFINITE);DeleteCriticalSection(&g_csThreadPara);DeleteCriticalSection(&g_csThreadCode);return 0;}


 

 

0 0