函数CreateSemaphore和ReleaseSemaphore声明如下:
WINBASEAPI
__out
HANDLE
WINAPI
CreateSemaphoreA(
    __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    __in     LONG lInitialCount,
    __in     LONG lMaximumCount,
    __in_opt LPCSTR lpName
    );
WINBASEAPI
__out
HANDLE
WINAPI
CreateSemaphoreW(
    __in_opt LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
    __in     LONG lInitialCount,
    __in     LONG lMaximumCount,
    __in_opt LPCWSTR lpName
    );
#ifdef UNICODE
#define CreateSemaphore CreateSemaphoreW
#else
#define CreateSemaphore CreateSemaphoreA
#endif // !UNICODE
lpSemaphoreAttributes是信号量的安全属性。
lInitialCount是初始化的信号量。
lMaximumCount是允许信号量增加到最大值。
lpName是信号量的名称。
WINAPI
ReleaseSemaphore(
    __in      HANDLE hSemaphore,
    __in      LONG lReleaseCount,
    __out_opt LPLONG lpPreviousCount
    );
hSemaphore是要增加的信号量句柄。
lReleaseCount是增加的计数。
lpPreviousCount是增加前的数值返回。
调用函数的例子如下:
#001 //线程运行函数。
#002 //在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
#004 DWORD CThreadSemaphore::Run(void)
#005 {
#006  //输出到调试窗口。
#007  ::OutputDebugString(_T("Run()线程函数运行/r/n"));     
#008 
#009  //
#010  const LONG cMax = 10;
#011   m_hSemaphore = CreateSemaphore(
#012        NULL,   // 缺省的安全属性。
#013        0,   // 初始化为0个信号量。
#014        cMax,   // 最大为10个信号量。
#015        NULL); // 不命名。
#016 
#017  if (m_hSemaphore == NULL)
#018  {
#019         return -1;
#020  }
#021 
#022  //
#023  const int nMaxObjs = 2;
#024  HANDLE hWaitObjects[nMaxObjs] = {m_hEventExit,m_hSemaphore};
#025 
#026  //线程循环。
#027  for (;;)
#028  {
#029         DWORD dwRet = WaitForMultipleObjects(nMaxObjs,hWaitObjects,FALSE,INFINITE);
#030         if (dwRet == WAIT_TIMEOUT)
#031         {
#032               //可以继续运行。                
#033               TCHAR chTemp[128];
#034               wsprintf(chTemp,_T("CThreadSemaphore::Run() ThreadID=%d/r/n"),m_dwThreadID);
#035               ::OutputDebugString(chTemp);
#036 
#037               //目前没有做什么事情,就让线程释放一下CPU。
#038               Sleep(10);
#039         }
#040         else if (dwRet == WAIT_OBJECT_0)
#041         {
#042               //退出线程。
#043               ::OutputDebugString(_T("Run() 退出线程/r/n"));
#044               break;
#045         }
#046         else if (dwRet == WAIT_OBJECT_0+1)
#047         {
#048               //可以继续运行。                
#049               TCHAR chTemp[128];
#050               wsprintf(chTemp,_T("CThreadSemaphore::Run() Semaphore,ThreadID=%d/r/n"),m_dwThreadID);
#051               ::OutputDebugString(chTemp);
#052 
#053               //
#054 
#055         }
#056         else if (dwRet == WAIT_ABANDONED)
#057         {
#058               //出错。
#059               ::OutputDebugString(_T("Run() 线程出错/r/n"));
#060               return -1;
#061         }
#062  }
#063 
#064  //
#065  if (m_hSemaphore)
#066  {
#067         CloseHandle(m_hSemaphore);
#068          m_hSemaphore = NULL;
#069  }
#070 
#071  return 0;
#072 }
#073 
第11行就是创建信号量。
第29行等信号量事件和退出事件。
#003  //增加信号量
  void IncSemaphore(void)
  {
        if (m_hSemaphore)
        {
             if (!ReleaseSemaphore(
                    m_hSemaphore, // 要增加的信号量。
                  1,           // 增加1.
                 NULL) )      // 不想返回前一次信号量。
            {
              }
       }
 }
 

函数CreateSemaphore和ReleaseSemaphore相关推荐

  1. Windows API一日一练(47)CreateSemaphore和ReleaseSemaphore函数

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  2. CreateSemaphore和ReleaseSemaphore函数

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  3. Windows API一日一练 47 CreateSemaphore和ReleaseSemaphore函数

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  4. Windows API -- CreateSemaphore和ReleaseSemaphore函数

    该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,以下是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济.行业趋势.心灵文章等,有兴趣的朋友可以踩 ...

  5. CreateSemaphore和ReleaseSemaphore函数(转)

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  6. CreateEvent、CreateSemaphore、ReleaseSemaphore、CreateMutex

    /// 用户模式 对事件进行初始化操作 HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性BOOL bManualR ...

  7. CreateSemaphore与ReleaseSemaphore

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  8. 十六:CreateSemaphore创建信号量,ReleaseSemaphore增加信号量 函数

    在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.CreateSema ...

  9. 转:信号量semphore

    转自:蔡军生博文 在开发软件的过程中,多线程的程序往往需要实现相互通讯,比如几个线程添加一个消息到队列里,而另一个线程在睡眠时,就需要唤醒那个线程来处理事情.在这其中,就需要使用到信号量来进行同步.C ...

最新文章

  1. 5天玩转mysql视频教程_六天带你玩转MySQL
  2. 【大总结1】数据结构与传统算法总结
  3. Kafka如何更新元数据到各broker节点
  4. 修复 IE 的文本3像素偏移Bug
  5. 5G来了 多款4G手机开始降价销售
  6. Anaconda下安装 TensorFlow 和 keras 以及连接pycharm
  7. c语言用单链表实现lru算法,利用单链表实现LRU算法
  8. c#压缩解压缩bzip2、tar、zip、gzip、deflate、ntdll
  9. indesign软件教程,如何将文本格式保存为样式?
  10. AllenNLP 用法总结
  11. 恒压供水程序 三菱plc恒压供水程序,威纶触摸屏程序
  12. php布尔运算,布尔逻辑运算符有哪些?
  13. ubuntu18.4解决问题: Installation failed. See log at /var/log/cuda-installer.log for details.
  14. 曾几何时,还是游吟长安的醉客
  15. 再看《西游记》——吴承恩眼中的现实社会是如何折射到《西游记》中的
  16. excel制作文件夹侧标签
  17. 机器学习-周志华-课后习题答案-线性模型
  18. PS 选区时显示像素
  19. MonoRail学习-入门实例篇
  20. 2-04-调用函数-0518

热门文章

  1. Android上的linux终端模拟器
  2. ubuntu下创建python文件创建python环境
  3. VisionPro 8.2支持的工业相机和格式
  4. Unity Shader镜面效果
  5. jar包是什么,做什么用的?
  6. linux怎么读其实很简单 微星为你详解Z77主板BIOS设置
  7. 扩展quill-editor的工具栏
  8. 拒绝“Xcode-Ghost门”,如何安全快速下载Xcode?
  9. 杭电oj —— 2010
  10. mysql词法分析antlr4_ANTLR 实战 SQL 词法/语法分析