信号量CSemaphore的使用

信号量是CSemaphore的对象,该对象的作用是对访问某个共享资源的线程的数目进行控制。

CSemaphore类的构造函数原型如下:

CSemaphore( 
    LONG lInitialCount  /* = 1 */,     //计数器的初始值 
    LONG lMaxCount  /* = 1 */,         //计数器的最大计数值 
    LPCTSTR pstrName /* =NULL */,         //信号的名称 
    LPSECURITY_ATTRIBUTES lpsaAttributes  /* = NULL */     //指向一个SECURITY_ATTRIBUTES结构的指针 

信号量对象中有一个可以设置初值的计数器,每当一个线程使用资源时,在该线程中就调用信号计数器对象的成员函数Lock()将该计数器的值减一,当计数器为0时,就不再允许其他线程访问该资源;而当一个线程使用信号量对象的成员函数Unlock()释放资源时,可以将计数器的值加一。因此,信号量对象允许多个线程访问同一个资源,但同时访问该资源的线程总数不能超过信号量对象的最大计数值。

示例:编写一个有四个线程的应用程序,理解信号量对象的使用。
1.创建单文档应用程序;
2.在视图类的实现文件定义一个信号量对象:

CSemaphore semaphoreObj( 2, 3); 

3.在视图类的实现文件中定义四个线程函数:

UINT MessageThread1(LPVOID pParam) 

    semaphoreObj.Lock(); 
    LPTSTR pMessage = _T( "Thread1 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T( "Thread messaeg"), MB_OK); 
    semaphoreObj.Unlock(); 
     return  0

UINT MessageThread2(LPVOID pParam) 

    semaphoreObj.Lock(); 
    LPTSTR pMessage = _T( "Thread2 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T( "Thread messaeg"), MB_OK); 
    semaphoreObj.Unlock(); 
     return  0

UINT MessageThread3(LPVOID pParam) 

    semaphoreObj.Lock(); 
    LPTSTR pMessage = _T( "Thread3 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T( "Thread messaeg"), MB_OK); 
    semaphoreObj.Unlock(); 
     return  0

UINT MessageThread4(LPVOID pParam) 

    semaphoreObj.Lock(); 
    LPTSTR pMessage = _T( "Thread4 is started"); 
    CWnd *pMainWnd = AfxGetMainWnd(); 
    ::MessageBox(pMainWnd->m_hWnd, pMessage, _T( "Thread messaeg"), MB_OK); 
    semaphoreObj.Unlock(); 
     return  0

4.在视图类的鼠标左键消息函数里面添加如下:

void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    AfxBeginThread(MessageThread1, _T( "Thread is started")); 
    AfxBeginThread(MessageThread2, _T( "Thread is started")); 
    AfxBeginThread(MessageThread3, _T( "Thread is started")); 
    AfxBeginThread(MessageThread4, _T( "Thread is started")); 
    CView::OnLButtonDown(nFlags, point); 

程序运行结果如下:

参考资料:
1.信号量(CSemaphore)——MFC http://blog.sina.com.cn/s/blog_627ebfc30100iv4w.html
2.《MFC Windows应用程序设计(第2版)》

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值