您的位置:首页 > 其它

windows多线程同步机制---临界区

2016-02-16 21:33 447 查看

 临界区

  

  临界区作用

    线程在执行代码时,将代码锁定,不允许其他线程执行,只有该线程离开后, 其他线程才能使用这些代码

 临界区的使用

    2.1 初始化临界区

       VOID InitializeCriticalSection(

       LPCRITICAL_SECTION lpCriticalSection

         //临界区结构地址

       );

    2.2 临界区加锁

       VOID EnterCriticalSection(

  LPCRITICAL_SECTION lpCriticalSection   // pointer to critical 

          //临界区
   );

    2.3 临界区解锁

       VOID LeaveCriticalSection(

       LPCRITICAL_SECTION lpCriticalSection 

          // 临界区 

       );

    2.4 释放临界区

       VOID DeleteCriticalSection(

       LPCRITICAL_SECTION lpCriticalSection   

               //临界区

       );

  3 和原子锁相比

    原子锁是一条语句 临界区可以完成多条语句的锁定.

// CriticalSection.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "conio.h"
#include "windows.h"

CRITICAL_SECTION g_cs = { 0 };
LONG nValue = 0;

void Print( )
{ //进入临界区 - 加锁
EnterCriticalSection( &g_cs );

printf( "Long long long.......\n" );
nValue++;

//离开临界区 - 解锁
LeaveCriticalSection( &g_cs );
}

DWORD WINAPI PrintProc( LPVOID pParam )
{
while( 1 )
{
Print( );
Sleep( 100 );
}
return 0;
}

void Create( )
{
DWORD nThreadID = 0;
HANDLE hThread[2] = { 0 };
hThread[0] = CreateThread( NULL, 0,
PrintProc, NULL, 0, &nThreadID );
hThread[1] = CreateThread( NULL, 0,
PrintProc, NULL, 0, &nThreadID );

getch( );
}

int main(int argc, char* argv[])
{ //初始化临界区
InitializeCriticalSection( &g_cs );
Create( );
//删除临界区
DeleteCriticalSection( &g_cs );
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息