Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682820
  • 博文数量: 1493
  • 博客积分: 38
  • 博客等级: 民兵
  • 技术积分: 5834
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-19 17:28
文章分类

全部博文(1493)

文章存档

2016年(11)

2015年(38)

2014年(137)

2013年(253)

2012年(1054)

2011年(1)

分类:

2012-12-11 08:57:55

原文地址:线程同步之信号量方法 作者:xhch_it

信号量定义和运用:每一时刻只允许单线程访问
情形一:
class A
{
   public:
        A();
        ~A();
   public:
        ini();
        Unini();
        func();
        MainFunc();
        CSemaphore g_semaphore;//定义信号量
}
A::A()//构造函数先初始化信号量
{
   g_semaphore(0,2);//初始化不允许线程访问
}
A::Unini()//卸载函数,释放信号量
{
   ReleaseSemaphore(m_waitBluthSemaphore.m_hObject, 1, NULL);//释放一个线程资源
}
A::ini()//初始化函数,释放信号量
{
   ReleaseSemaphore(m_waitBluthSemaphore.m_hObject, 1, NULL);//释放一个线程资源
}
A::func()
{
 if (NULL == m_hWaitHandle)
{//线程创建
   m_hWaitHandle = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&ThreadFunc,this, 0, NULL);
 }
......
}
 
int ThreadFunc()//线程函数
{
   DWord dwWaitSingle = WaitForSingleObject(pCls->m_waitBluthSemaphore.m_hObject,  6*1000);//等待信号量释放,超时6秒
 
if (NULL !=pA->m_hWaitHandle)
{//执行完之后关闭该线程,释放信号量
  CloseHandle(pA->m_hWaitHandle);
  pA->m_hWaitHandle = NULL;
 }
}
 
A::MainFunc()//主调函数
{
  ini();
  func();
  Unini();
  ......
}
 
通过调用ini(),释放一个信号量,允许一个线程访问,func中开启一个线程占用资源,一个线程完成之后,才允许下次启动另外一个线程访问,每次只允许一个线程函数访问。最后通过调用Unini释放信号量。
 
 
情形二:
CSemaphore g_Websemaphore(1,2);//全局信号量,初始化信号量为1
{
   public:
        B();
        ~B();
   public:
        func();  
}
 
B::func()
{
  DWORD  dwWaitSingle = WaitForSingleObject(g_Websemaphore.m_hObject, TIME_OUT);
 //等待上次线程结束,TIME_OUT设置超时?
 if (dwWaitSingle == WAIT_FAILED)
 {
    return ;//失败
 }
 if (dwWaitSingle == WAIT_TIMEOUT)
 {
    return ;//超时
 }
   ......
   ReleaseSemaphore(g_Websemaphore.m_hObject, 1, NULL);//处理完了就释放信号量
}
 
调用func,需要通过信号量来判断是否可以继续执行,这样保证了该函数同一时刻只执行一次(相当于主线程的同步问题)
 
 
 
阅读(266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~