C++使用临界区实现进程同步

来源:互联网 发布:广州旅游数据 编辑:程序博客网 时间:2024/04/30 02:53

进程同步在多线程应用程序中是非常重要的,实现进程同步也有很多方法,可以利用互斥锁,可以利用事件,这两种方法可以查阅MSDN相关部分,主要看如何利用临界区实现进程同步

#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI threadFun1(
  LPVOID lpParameter   // 线程1的线程函数声明
);
DWORD WINAPI threadFun2(
  LPVOID lpParameter   // 线程2的线程函数声明
);
int tickets=100;//火车站的总票数
CRITICAL_SECTION g_cs;//临界区的参数
///////////////////////////////////////////////////////////////////////
//名称:main//
//功能:用两个线程模拟火车站的售票系统,并用临界区实现线程的同步//
//////////////////////////////////////////////////////////////////////
void main()
{
HANDLE hThread1;
hThread1=CreateThread(NULL,0,threadFun1,NULL,0,NULL);
HANDLE hThread2;
hThread2=CreateThread(NULL,0,threadFun2,NULL,0,NULL);
CloseHandle(hThread1);//创建线程1
CloseHandle(hThread2);//创建现成
InitializeCriticalSection(&g_cs);//初始化临界区
Sleep(4000);//主程序睡眠4秒,使线程函数得以运行
DeleteCriticalSection(&g_cs);//程序执行完毕,销毁临界区
}
DWORD WINAPI threadFun1(LPVOID lpParameter)   // 线程1
{
while(TRUE)
{
  EnterCriticalSection(&g_cs);//申请进入临界区
  if(tickets>0)
  {
   Sleep(1);
   cout<<"Thread1 sells ticket:"<<tickets--<<endl;
  }
  else
   break;
  LeaveCriticalSection(&g_cs);//释放临界区资源
}
return 0;
}

DWORD WINAPI threadFun2(LPVOID lpParameter)   // 线程2
{
while(TRUE)
{
  EnterCriticalSection(&g_cs);//申请进入临界区
  if(tickets>0)
  {
   Sleep(1);
   cout<<"Thread2 sells ticket:"<<tickets--<<endl;
  }
  else
   break;
  LeaveCriticalSection(&g_cs);//释放临界区资源
}
return 0;
}

通过以上代码就可以实现进程或者说线程间的同步

原创粉丝点击